ベスト プラクティス

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

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

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

共有ドライブでのコラボレーションを検討する

他のデベロッパーと共同でスクリプト プロジェクトに携わっている場合は、 共有ドライブを使用して Apps Script プロジェクトを共同編集する 共有ドライブ内のファイルのオーナーは、個人ではなくグループです。この プロジェクトの開発とメンテナンスが容易になります。

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

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

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

以下に例を示しますが、これに従ったり、使用したりしてはいけない例です。スクリプト 次のコードを使用して、 100×100 のスプレッドシート グリッド。これは、Terraform という 使用する色を決定する 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).setBackgrounds(colors);

非効率的なコードの実行には約 70 秒かかります。この効率的なコードは、 たった 1 秒!

UI を多用するスクリプトでライブラリを回避する

ライブラリは、コードの再利用に便利な手段で、 スクリプトの開始時間が少し長くなります。この遅延は、比較的長時間実行されるスクリプト(Google ドライブ ファイルをクリーンアップするユーティリティ スクリプトなど)では目立ちませんが、短時間実行の google.script.run 呼び出しを繰り返し行うクライアントサイドの HTML Service ユーザー インターフェースでは、すべての呼び出しに影響します。この問題のため、ライブラリでは、 アドオンでは控えめに使用するため、 google.script.run を頻繁に呼び出すアドオン以外のスクリプトでは、これらを避ける必要があります。

キャッシュ サービスを使用する

Cache Service を使用して、スクリプトの実行間でリソースをキャッシュに保存できます。データをキャッシュに保存することで、 データを取得する必要がある回数や頻度。 example.com にある RSS フィードに 20 個の 平均的なリクエストでアクセスを高速化したい場合。次の例は、Cache Service を使用してこのデータへのアクセスを高速化する方法を示しています。

  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 分で終わります