このドキュメントでは、スクリプトのパフォーマンス改善に役立つベスト プラクティスについて説明します。
他のサービスへの呼び出しを最小限に抑える
スクリプト内で JavaScript オペレーションを使用すると、他のサービスを呼び出すよりも大幅に高速になります。Google Apps Script 内で実行できる処理は、スプレッドシート、ドキュメント、サイト、翻訳、UrlFetch へのリクエストなど、Google のサーバーまたは外部サーバーからデータを取得する必要がある呼び出しよりもはるかに高速です。スクリプトがこれらのサービスに対して行う呼び出しを最小限に抑える方法を見つけると、スクリプトの実行速度が向上します。
共有ドライブでのコラボレーションを検討する
他のデベロッパーとスクリプト プロジェクトで作業している場合は、共有ドライブを使用して 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 回のみです。
ただし、呼び出しをバッチ処理することで、コードを大幅に効率化できます。次の書き換えでは、セル範囲が色という配列に読み込まれ、配列内のデータに対して色の割り当てが行われ、配列の値がスプレッドシートに書き出されます。
// 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 サービスを使用する
Cache Service を使用して、スクリプトの実行間でリソースをキャッシュに保存できます。データをキャッシュに保存することで、データの取得回数や頻度を減らすことができます。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 分間非常に高速になります。