背景
2024年10月頃より、Google Apps Scriptで「Too many simultaneous invocations: Spreadsheets」(同時呼び出しが多すぎます: スプレッドシート)のエラーの発生頻度が急に増えました。
スプレッドシートを扱うスクリプトをトリガーで実行している場合に見られるようです。
エラー内容はスプレッドシートへの同時アクセスが多すぎる事ですが、実際は、同時アクセスが全くない場合にもエラーが発生しています。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のエラーが発生しているユーザを多数見つけました。
ただし、検索した時点では解決方法についてはどこにも書かれていなかったので今回記事を作成しました。
排他処理で解決しない場合は、愚直に、エラー発生したらエラーをキャッチして、再度トライするようにするのでもいいとは思います。