最佳做法

本文說明瞭有助於提高指令碼效能的最佳做法。

盡量減少向其他服務的呼叫

在指令碼中使用 JavaScript 作業,會比呼叫其他服務更快。在 Google Apps Script 中完成的任何作業,都比呼叫需要從 Google 伺服器或外部伺服器擷取資料 (例如對試算表、文件、協作平台、翻譯、UrlFetch 等) 的呼叫快上許多。如果可以設法盡量減少指令碼對這些服務發出的呼叫,指令碼的執行速度會更快。

考慮透過共用雲端硬碟協同合作

如果您要與其他開發人員共同進行指令碼專案,可以透過共用雲端硬碟協作處理 Apps Script 專案。共用雲端硬碟中的檔案為群組擁有,而非個別使用者。這樣可以簡化專案的開發和維護工作。

使用批次作業

指令碼通常需要讀取試算表的資料、執行計算,然後將結果寫入試算表。Google Apps Script 已內建一些最佳化功能,例如使用預先快取快取功能擷取指令碼可能取得的內容,以及編寫快取來儲存可能設定的內容。

您可以編寫指令碼,將讀取和寫入次數降到最低,藉此充分利用內建的快取功能。交替讀取與寫入指令的速度相當緩慢。如要加快指令碼的速度,請透過一個指令將所有資料讀取為陣列,然後對陣列中的資料執行任何作業,並使用一個指令寫入資料。

以下為不應遵循或使用的範例。指令碼會使用下列程式碼,在 100 x 100 試算表格線中設定每個儲存格的背景顏色。並使用名為 getColorFromCoordinates() 的函式 (未顯示在這裡) 來判斷每個儲存格要使用的顏色:

  // DO NOT USE THIS CODE. It is an example of SLOW, INEFFICIENT code.
  // FOR DEMONSTRATION ONLY
  var cell = sheet.getRange('a1');
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    for (var x = 0; x < 100; x++) {
      var c = getColorFromCoordinates(xcoord, ycoord);
      cell.offset(y, x).setBackgroundColor(c);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
    SpreadsheetApp.flush();
  }

指令碼效率不佳:它會循環播放 100 個資料列和 100 個資料欄,並連續寫入 10,000 個儲存格。Google Apps Script 寫入快取有利於它,因為系統會在每一行結尾都使用清除功能強制回信。由於快取的緣故,試算表只有 100 次呼叫。

不過,若將程式碼批次處理,就能更有效率地執行呼叫。以下是將儲存格範圍讀取為稱為色彩的陣列的重新寫入,系統會對陣列中的資料執行色彩指派作業,並將陣列中的值寫入試算表:

  // OKAY TO USE THIS EXAMPLE or code based on it.
  var cell = sheet.getRange('a1');
  var colors = new Array(100);
  for (var y = 0; y < 100; y++) {
    xcoord = xmin;
    colors[y] = new Array(100);
    for (var x = 0; x < 100; x++) {
      colors[y][x] = getColorFromCoordinates(xcoord, ycoord);
      xcoord += xincrement;
    }
    ycoord -= yincrement;
  }
  sheet.getRange(1, 1, 100, 100).setBackgroundColors(colors);

如果程式碼效率低落,執行時間大約需要 70 秒。高效率的程式碼只在 1 秒內執行!

避免在會耗用大量 UI 的指令碼中編寫程式庫

程式庫是重複使用程式碼的便利方式,但會稍微增加啟動指令碼所需的時間。針對相對長時間執行的指令碼 (例如用來清理 Google 雲端硬碟檔案的公用程式指令碼),這項延遲情況並不明顯,但對於用戶端 HTML 服務使用者介面發出重複執行的 google.script.run 呼叫,延遲時間將會影響每次呼叫。因此,請慎選在外掛程式中使用程式庫,最好避免在會發出大量 google.script.run 呼叫的非外掛程式指令碼中使用這些程式庫。

使用快取服務

您可以使用快取服務,在指令碼執行之間快取資源。透過快取資料,您可以減少擷取資料的次數或頻率。假設您在 example.com 建立 RSS 動態消息,需要 20 秒的擷取時間,而您想要加快平均要求的存取速度。以下範例說明如何使用快取服務,加快這項資料的存取速度。

  function getRssFeed() {
    var cache = CacheService.getScriptCache();
    var cached = cache.get("rss-feed-contents");
    if (cached != null) {
      return cached;
    }
    // This fetch takes 20 seconds:
    var result = UrlFetchApp.fetch("http://example.com/my-slow-rss-feed.xml");
    var contents = result.getContentText();
    cache.put("rss-feed-contents", contents, 1500); // cache for 25 minutes
    return contents;
  }

現在,如果項目不在快取中,則仍須等待 20 秒,後續存取作業會非常快,直到項目在 25 分鐘內從快取過期為止。