GAS Webアプリの同時アクセスクォータエラー対策
複数人利用のGoogle Apps ScriptアプリでSpreadsheetApp.openByIdが同時呼び出しエラーになる問題を、リトライ+バックオフ+ジッターのラッパー関数で解消する手順
約900トークンの節約 (API料金換算で約1円分)。 要件定義・技術調査・試行錯誤ぶんのトークンがまるごと不要になります。※ 出品者申告とレビューに基づく推定値。モデル・タスク内容により変動します。
この巻物について
「GAS Webアプリの同時アクセスクォータエラー対策」は、Google WorkspaceカテゴリのAI指示書(MDファイル)です。複数人利用のGoogle Apps ScriptアプリでSpreadsheetApp.openByIdが同時呼び出しエラーになる問題を、リトライ+バックオフ+ジッターのラッパー関数で解消する手順この巻物をAIに読み込ませると、ゼロから設計・調査する場合に比べて 約900トークン(API料金換算で約1円)・50%のトークンを節約できます。
- カテゴリ
- Google Workspace
- 対応AI
- claude-code、cursor、codex-cli
- ライセンス
- 商用利用可 (再販不可)
- 価格
- 無料
- ゼロから開発時
- 約1,800トークン
- この巻物使用時
- 約900トークン
- 節約量
- 約900トークン (約1円)
- 更新日
- 2026-08-26
使い方 (AIに渡す3つの方法)
いちばん簡単なのはワンライナー。Claude Code のターミナルに貼るだけです。
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-2/raw を読み込んで、この指示書どおりに実装して"
中身
GAS Webアプリの「同時呼び出しの数が多すぎます: スプレッドシート」対策
症状
複数人が同時に使うGoogle Apps Script製のWebアプリ(doGetで配信しgoogle.script.runでRPCするタイプ)で、
ある瞬間から特定の画面だけ以下のようなエラーが表示されるようになる。
エラー: 同時呼び出しの数が多すぎます: スプレッドシート
(英語環境では Too many simultaneous invocations: Spreadsheet)
原因
これはアプリ固有のバグではなく、同じスプレッドシートに対して複数の実行(=複数ユーザーの同時アクセス)が 短時間に集中したときにGoogle Apps Script側が出すクォータ制限エラー。
特に次の条件が揃うと発生しやすい:
SpreadsheetApp.openById(SAME_ID)を呼ぶ関数がコード内の多数箇所(十数〜数十箇所)に散らばっている- 1回の画面ロードでクライアントが複数の
google.script.runを並行に発火する - 1つのサーバー関数の中で、同じスプレッドシートを目的別に何度も開き直している(例: 案件シートを開いた後、 別の関数を呼んでマスタシートをもう一度開く、など)
- アプリの利用者が複数人おり、業務のピーク時間帯にアクセスが重なる
これらが重なると、瞬間的な同時実行数がGAS側の上限に触れ、リトライ処理が無いコードではそのまま ユーザーにエラーが表示されてしまう。
切り分け方
- エラーメッセージに「同時呼び出し」「simultaneous」が含まれるか確認する(サーバー側の一時的な クォータエラーである可能性が高いサイン。恒常的な権限エラーや構文エラーとは性質が違う)。
- コード内で同じスプレッドシートIDに対する
SpreadsheetApp.openById(...)の呼び出し箇所数を数える (grep -c "SpreadsheetApp.openById" *.gs)。1桁で収まっていれば別原因の可能性が高い。 - 複数人が同時にアプリを操作するタイミング(始業直後・繁忙時間帯など)で再現するかをヒアリングする。 単独利用時には再現しないことが多い。
対策: リトライ付きラッパー関数に一括置換する
.gs ファイルの冒頭に以下のヘルパーを追加する。
// スプレッドシートを開く(同時アクセス過多エラーに備えてリトライ)
function openSSWithRetry_(id) {
var maxRetries = 4;
var delays = [300, 800, 1500, 3000]; // ms, 徐々に長く
for (var i = 0; i < maxRetries; i++) {
try {
return SpreadsheetApp.openById(id);
} catch (e) {
var msg = String(e && e.message || e);
var isQuotaError = msg.indexOf('同時呼び出し') !== -1 || msg.indexOf('simultaneous') !== -1;
if (!isQuotaError || i === maxRetries - 1) throw e;
Utilities.sleep(delays[i] + Math.floor(Math.random() * 200)); // 軽いジッター
}
}
}
その上で、ファイル内の SpreadsheetApp.openById(...) をすべて openSSWithRetry_(...) に機械的に置換する
(正規表現 SpreadsheetApp\.openById\( → openSSWithRetry_( で安全に一括置換できる。FormApp.openById
など他のサービスは対象外)。
ポイント:
- クォータエラー以外(構文エラー・権限エラー・存在しないID等)はリトライせず即座に再スローする。 無関係なエラーまでリトライすると原因究明が遅れる。
- 待機時間は徐々に伸ばす(300ms→800ms→1500ms→3000ms)と、短い衝突は数百msで解消し、 重い衝突でも数秒以内に解消することが多い。
- ジッター(ランダムな遅延の上乗せ)を入れることで、複数の実行が同時にリトライしてまた衝突する 「再衝突」を避けやすくなる。
- 既存の try/catch で独自のエラーメッセージに変換している箇所は、内側の
openById呼び出しだけを 置換し、外側の catch ロジックは変更しない。
適用後の確認
- 構文チェック(
node --check。.gsは.jsに拡張子を変えてチェックすればよい) - デプロイ後、ソースを
clasp pullし直してローカルファイルとバイト単位で一致することを確認する (デプロイの取りこぼしを防ぐ) - 実際に複数人で同時に操作してもらい、エラーが再現しないことを確認する
応用
- 同じ問題は
DriveApp,FormAppなど他のGASサービスでも構造的には起こりうる(当該サービス名を エラーメッセージから読み取り、同じパターンのラッパーを用意すればよい)。 - 1回のリクエストで同じスプレッドシートを何度も開き直している場合は、リトライ対策に加えて 「サーバー関数内でSpreadsheetオブジェクトを使い回す」「読み取り専用データはCacheServiceで 数十秒キャッシュする」ことで、そもそもの同時オープン回数自体を減らせる。
よくある質問
+「GAS Webアプリの同時アクセスクォータエラー対策」とは何ですか?
複数人利用のGoogle Apps ScriptアプリでSpreadsheetApp.openByIdが同時呼び出しエラーになる問題を、リトライ+バックオフ+ジッターのラッパー関数で解消する手順
+どれくらいトークン(費用)を節約できますか?
ゼロから開発すると約1,800トークンかかりますが、この巻物を使えば約900トークンで済みます。差し引き約900トークン(API料金換算で約1円)・50%の節約です。
+どうやって使いますか?
無料です。MDファイルを Claude Code などのAIに読み込ませるだけ。ワンライナーをターミナルに貼れば実装が始まります。要件定義や技術調査を省いて実装だけにトークンを使えます。
+どのAIツールに対応していますか?
claude-code、cursor、codex-cli に対応しています。
+商用利用できますか?
ライセンスは「商用利用可 (再販不可)」です。
🤝 自分でAIを動かすのは、まだ不安…という方へ
この巻物の内容を、AIを使うプロに丸ごと任せることもできます。姉妹サービスAI代行堂なら「LINEで頼むだけで、仕事が完成」。
関連する巻物
GAS完全自動化テンプレ — Driveコマンドキュー方式
Google Apps Script の「毎回エディタで▶実行」を根絶。Drive 経由のコマンドキューで、初回1クリック以降は AI がすべての GAS 関数をリモート実行できるようになるテンプレート指示書。
人間の手入力台帳を壊さずに自動更新する — GAS Web App upsert 設計
各PC/各拠点の点検結果を、人間が手運用しているスプレッドシート台帳へ自動反映する。手入力列とコメントを絶対に壊さない突合設計、タブ/列の解決、並行POST対策、配布シークレットの落とし穴まで。
数式まみれの業務スプレッドシートを、Webアプリから壊さずに編集させる型
ArrayFormula と per-row 数式が混在する台帳を、セル単位 allowlist・dry-run 既定・適用前バックアップ・触っていないセルの数式不変検査で安全に書き換える設計手順。列ごとの数式復元と、テストが緑のまま壊れる典型例つき。
この巻物、誰かのトークンも救えます
𝕏 で節約レシートをシェア