最佳做法

本文件列出有助於改善效能的最佳做法 編寫指令碼

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

在指令碼中使用 JavaScript 作業的速度比 呼叫其他服務可在 Google Apps Script 中完成的任何項目 速度會比發出呼叫需要擷取資料的速度更快 Google 伺服器或外部伺服器,例如對試算表、文件 網站、翻譯、UrlFetch 等。如果您能想辦法減少指令碼對這些服務的呼叫次數,指令碼執行速度就會加快。

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

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

使用批次作業

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

您可以編寫指令碼以充分運用內建的快取功能,方法是 盡可能減少讀取和寫入次數。交替讀取和寫入指令 是很慢的如要加快指令碼的速度,只要一個指令,就能將所有資料讀入陣列。 對陣列中的資料執行任何作業,然後以 一個指令

以下是您不應遵循或使用的示例。指令碼 使用以下程式碼設定 a 中每個儲存格的背景顏色 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 欄,寫入 合併至 1 萬個儲存格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).setBackgrounds(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 分鐘內開始