マキモノ
Google Workspace無料✅ 公式検証済みv1.0.0 / 更新

GAS Webアプリの同時アクセスクォータエラー対策

複数人利用のGoogle Apps ScriptアプリでSpreadsheetApp.openByIdが同時呼び出しエラーになる問題を、リトライ+バックオフ+ジッターのラッパー関数で解消する手順

出品者: miho.furukawa0430@gmail.com1 DL📖 読込 約1,418トークン (約2円)💰 コスパ 1
トークン節約メーター50%節約
ゼロからAIに作らせた場合1,800トークン
このMDを読ませた場合900トークン

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 のターミナルに貼るだけです。

⬇ .md をダウンロード
claude "https://makimono-md.vercel.app/api/v1/files/gas-web-2/raw を読み込んで、この指示書どおりに実装して"
claude-codecursorcodex-cliライセンス: 商用利用可 (再販不可)

中身

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側の上限に触れ、リトライ処理が無いコードではそのまま ユーザーにエラーが表示されてしまう。

切り分け方

  1. エラーメッセージに「同時呼び出し」「simultaneous」が含まれるか確認する(サーバー側の一時的な クォータエラーである可能性が高いサイン。恒常的な権限エラーや構文エラーとは性質が違う)。
  2. コード内で同じスプレッドシートIDに対する SpreadsheetApp.openById(...) の呼び出し箇所数を数える (grep -c "SpreadsheetApp.openById" *.gs)。1桁で収まっていれば別原因の可能性が高い。
  3. 複数人が同時にアプリを操作するタイミング(始業直後・繁忙時間帯など)で再現するかをヒアリングする。 単独利用時には再現しないことが多い。

対策: リトライ付きラッパー関数に一括置換する

.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で頼むだけで、仕事が完成」。

AI代行堂を見る →

関連する巻物

この巻物、誰かのトークンも救えます

𝕏 で節約レシートをシェア