最佳做法

本文件列出能協助您改善指令碼效能的最佳做法。

盡量減少撥打給其他服務的通話

在指令碼中使用 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 雲端硬碟檔案的公用程式指令碼) 時,系統不會察覺這段延遲時間,但對於會重複執行的短時間 google.script.run 呼叫的用戶端 HTML 服務使用者介面,延遲時間會影響每次呼叫。因此,請謹慎在外掛程式中使用程式庫,最好避免在會發出大量 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 分鐘後從快取到期為止。