背景
2024年10月10日頃から、Google Apps Scriptで「Exception: Too many simultaneous invocations: Spreadsheets」(同時呼び出しが多すぎます: スプレッドシート)のエラーの発生頻度が急に増えました。
スプレッドシートを扱うスクリプトをトリガーで実行しているユーザーの一部で起こっている現象のようです。
該当ユーザでも必ず起こるわけではなく、何度かに1回程度の頻度のようです。
エラー内容はスプレッドシートへの同時アクセスが多すぎる事ですが、実際は、同時アクセスが全くない場合にもエラーが発生しています。Google側に何らかの問題が発生していると考えています。しばらくすればGoogle側で解決すると思いますが、それまでの期間のエラー回避方法が必要です。
一時的な対処方法としてスプレッドシートを扱う際にロック(排他処理)を掛けることで、プログラム実行中は操作するスプレッドシートへのアクセスを制限してみました。この方法で私の環境ではエラーの発生がほぼなくなりましたので、その方法について簡単に記載しておきます。
排他処理の実行例
SpreadSheetTask()が目的の処理で、それに対して排他処理を行っています。
function mainTask() {
// スクリプトレベルのロックを取得
const lock = LockService.getScriptLock();
try {
// 最大30秒間ロックを取得するまで待機
lock.waitLock(30000);
//目的の処理の実行
SpreadSheetTask()
} catch (e) {
Logger.log('ロックの取得中にエラーが発生しました: ' + e);
} finally {
// ロックを必ず解放
lock.releaseLock();
}
}
現状(2024/10/17)
海外での掲示板などでも、Too many simultaneous invocations: Spreadsheetsのエラーが発生しているユーザを多数見つけました。
ただし、検索した時点では解決方法についてはどこにも書かれていなかったので今回記事を作成しました。
追記(2024/10/18)
A wave of "Too many simultaneous invocations: Spreadsheets" errors [373461929] - Issue Tracker
単純に、GASのエラー発生したらエラーをキャッチしてリトライする対策を見かけました。途中までプログラムが実行されてエラー発生時点でリトライされますので、この方法を利用する前に任意のタイミングでプログラムが再実行されても大丈夫かの確認をしてから利用してください。