6分壁突破!分割実行で最適化
GAS初心者が直面する実行時間の壁
Google Apps Script は無料で利用できる便利なツールですが、実行時間に制限があります。初心者は「実行時間が長すぎる」とエラーになることに戸惑います。実際には、スクリプトが 6 分を超えると自動的に停止されるため、長時間処理を行う場合は注意が必要です。
この「6 分の壁」は、ユーザーがブラウザで実行した場合と、トリガーで実行した場合で同じです。GAS の実行時間は、スクリプトの種類や実行環境によって微妙に変わることがありますが、基本的には 6 分を超えるとタイムアウトが発生します。
6分の壁とタイムアウトの仕組み
タイムアウトは、Google のインフラストラクチャがリソースを公平に配分するために設けられた制限です。スクリプトが 6 分を超えると、Google のサーバー側で強制終了され、エラーが返されます。エラーコードは Execution time exceeded です。
タイムアウトは、ユーザーが手動で停止しない限り自動で発生します。したがって、長時間実行する処理は必ず分割実行やバッチ処理に分ける必要があります。
クオータとトリガー制限の確認方法
GAS にはクオータが設定されており、1 日あたりの実行回数や総実行時間が制限されています。Resources → Current project's triggers でトリガー制限を確認できます。
クオータはプロジェクトごとに異なり、無料版では 90 分/日、課金版では 6 時間/日まで拡張されます。トリガー制限は、1 分あたりの実行回数や同時実行数に制限があるため、スクリプトを設計する際に考慮する必要があります。
処理時間を短縮する最適化テクニック
処理時間を短くするための主な手法は、以下の通りです。
- 不要な API 呼び出しを削減する
- バッチ処理を利用して一括でデータを取得・更新する
- キャッシュを活用し、重複した計算を避ける
- ループ内でのオブジェクト生成を最小化する
例えば、スプレッドシートから大量のデータを読み込む場合、getValues() を一度だけ呼び出し、配列で処理することで API 呼び出し回数を減らせます。
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getValues();
// ここで data をループ処理
分割実行で制限を回避する戦略
長時間実行が必要な場合は、処理を複数の小さなタスクに分割し、時間ごとにトリガーで実行します。例えば、1 回の実行で 100 行ずつ処理し、次回のトリガーで残りを処理する方法です。
分割実行の実装例は以下の通りです。
function splitProcess() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName('Data');
var lastRow = sheet.getLastRow();
var startRow = PropertiesService.getScriptProperties().getProperty('startRow') || 1;
var batchSize = 100;
var endRow = Math.min(startRow + batchSize - 1, lastRow);
var range = sheet.getRange(startRow, 1, endRow - startRow + 1, sheet.getLastColumn());
var values = range.getValues();
// ここで values を処理
PropertiesService.getScriptProperties().setProperty('startRow', endRow + 1);
if (endRow < lastRow) {
ScriptApp.newTrigger('splitProcess')
.timeBased()
.after(1000) // 1 秒後に再実行
.create();
}
}
このように分割実行を組み合わせることで、6 分の壁やクオータ制限を回避しつつ、安定した処理が可能になります。
コメント
コメントを投稿