ベスト プラクティス

このドキュメントでは、スクリプトのパフォーマンスを改善するのに役立つベスト プラクティスについて説明します。

他のサービスへの呼び出しを最小限に抑える

スクリプト内で JavaScript オペレーションを使用すると、他のサービスを呼び出すよりも大幅に高速になります。Google Apps Script 自体で実行できる処理は、Google のサーバーや外部サーバーからデータを取得する必要がある呼び出し(スプレッドシート、ドキュメント、サイト、翻訳、UrlFetch などのリクエスト)よりもはるかに高速です。スクリプトがこれらのサービスに対して行う呼び出しを最小限に抑える方法を見つけることができれば、スクリプトの実行速度が向上します。

共有ドライブでの共同編集を検討する

他のデベロッパーとスクリプト プロジェクトに取り組んでいる場合は、共有ドライブで Apps Script プロジェクトを共同編集することができます。共有ドライブ内のファイルは、個人ではなくグループが所有します。これにより、プロジェクトの開発と保守が容易になります。

バッチ オペレーションを使用する

スクリプトでは、スプレッドシートからデータを読み込み、計算を実行してから、データの計算結果をスプレッドシートに書き出すことがよくあります。Google Apps Script には、先読みキャッシュを使用してスクリプトが取得する可能性の高いものを取得したり、書き込みキャッシュを使用して設定される可能性の高いものを保存したりするなど、組み込みの最適化がすでにいくつかあります。

読み取りと書き込みの数を最小限に抑えることで、組み込みのキャッシュ保存を最大限に活用するスクリプトを作成できます。読み取りコマンドと書き込みコマンドを交互に実行すると、処理が遅くなります。スクリプトを高速化するには、1 つのコマンドですべてのデータを配列に読み取り、配列内のデータに対してオペレーションを実行し、1 つのコマンドでデータを書き出します。

以下に例を示します。この例は、参考にしたり使用したりしないでください。スクリプトは次のコードを使用して、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 ドライブのファイルをクリーンアップするユーティリティ スクリプトなど)では目立ちませんが、短い google.script.run 呼び出しを繰り返すクライアントサイドの HTML Service ユーザー インターフェースでは、すべての呼び出しに影響します。この問題のため、アドオンではライブラリの使用を控え、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 分間は、アイテムがキャッシュから期限切れになるまで、アクセスが非常に高速になります。