TL;DR: クイックフィックス
このエラーは、Googleが「処理が追いつかない」と言っているようなものだと考えてください。通常、バックエンドが混雑しているか、スプレッドシートが肥大化しすぎているときに発生する汎用的なタイムアウトです。昨日まで動いていたスクリプトが今日突然失敗する場合は、次の3つのステップを試してください。
- リトライループの実装:
SpreadsheetAppの呼び出しを、エクスポネンシャルバックオフ(指数関数的後退法)を用いたtry-catchブロックで囲みます。 - データのバッチ処理: ループ内での
getValue()を単一のgetValues()呼び出しに置き換え、APIのオーバーヘッドを最小限に抑えます。 - 不要なデータの削除: 使用していない行や列をすべて削除します。5万行の空行があるだけでも、メタデータを消費しサービスの動作を遅くします。
/**
* スプレッドシート操作のための堅牢なラッパー
*/
function callWithRetry(fn, maxRetries = 3) {
for (let i = 0; i {
let val = row[0];
});
3. 徹底したシートのクリーンアップ
Google SheetsはXML構造として保存されています。セルが「空」であっても、システムはその書式設定やメタデータを追跡しています。シートに20列しかないのに右側に1,000列の空白列がある場合は、それらを削除してください。シートを50万セルから実際に使用している1万セルまで削ぎ落とすことで、実行時間を50%以上短縮できる場合があります。
4. 重い計算をオフロードする
シートに数百ものARRAYFORMULAやIMPORTRANGEの呼び出しが含まれていませんか?これらは、スクリプトがシートを開くたびに再計算を強制します。計算に30秒以上かかる場合、スクリプトサービスはタイムアウトします。計算をスクリプト側で行い、最終的な値を静的なテキストとして書き込むことを検討してください。
修正の確認方法
修正の成果を以下の3つの指標で確認してください:
- 実行ログ: Apps Scriptダッシュボードの「実行数」タブを確認します。「タイムアウト」や「失敗」のステータスコードが減少していれば、リトライロジックが機能しています。
- チャンク単位で処理する: 10万行以上のデータを扱う場合は、一度に処理しないでください。メモリ消費を抑えるために、5,000行ずつのバッチに分割して処理します。
- Issue Trackerを確認する: 最適化を行ってもエラーが解消されない場合は、Google Apps Script Issue Trackerを確認してください。これはGoogle側でしか解決できない、特定の地域での既知の障害である可能性があります。

