最佳做法

這份文件列出最佳做法,有助於提升指令碼的效能。

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

在指令碼中使用 JavaScript 作業,比呼叫其他服務快得多。在 Google Apps Script 本身完成任何工作,都比發出需要從 Google 伺服器或外部伺服器擷取資料的呼叫快得多,例如對 Google 試算表、Google 文件、Google 協作平台、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 次呼叫。

但只要批次處理呼叫,程式碼效率就能大幅提升。以下是重寫的程式碼,其中儲存格範圍會讀取至名為「colors」的陣列,顏色指派作業會在陣列中的資料上執行,而陣列中的值會寫入試算表:

  // 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).setBackgrounds(colors); 

效率不彰的程式碼執行時間約為 70 秒。有效率的程式碼只需 1 秒即可執行完畢!

避免在 UI 密集型指令碼中使用程式庫

程式庫是重複使用程式碼的便利方式,但會稍微增加啟動指令碼所需的時間。如果指令碼執行時間較長 (例如用於清除 Google 雲端硬碟檔案的公用程式指令碼),這項延遲不會造成明顯影響,但如果是透過HTML 服務建立的用戶端使用者介面,且會重複進行執行時間較短的 google.script.run 呼叫,則每次呼叫都會受到延遲影響。因此,您應在外掛程式中節省使用程式庫,並盡量避免在會發出大量 google.script.run 呼叫的非外掛程式指令碼中使用程式庫。

使用快取服務

您可以使用 Cache Service 在指令碼執行期間快取資源。快取資料可減少擷取資料的次數或頻率。假設 example.com 有一個 RSS 饋給,擷取時間需要 20 秒,而您想加快平均要求的存取速度。下例說明如何使用 Cache 服務加快存取這項資料的速度。

  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 分鐘後從快取中過期為止。