実現したいこと
複数の審判がそれぞれ担当選手の結果をフォームから都度入力・送信し、スプレッドシートへ結果を反映するWebフォームをGASで制作しています。
審判数は10名程度(つまりフォームを使う端末は10台程度)で、30〜60秒毎程度のペースで2時間ほど担当選手の結果を送信します。
(表面的にやっていることとしてはGoogleフォームでも実現できますが、フォームのUIをカスタマイズするためGASで作っています)
その中で下記のエラーが稀に発生しており、原因と再現方法、および解消方法を見出したいと考えています。
GASをデプロイする際は、以下の設定です。
種類:ウェブアプリ
次のユーザとして実行:自分
アクセスできるユーザ:全員
発生している問題・分からないこと
フォームから送信ボタンを押すと、【このGoogle ユーザーアカウントでは、同時に実行中のスクリプトが多すぎます。】というエラーメッセージが稀に発生する。
開発者側ではこのエラーを再現することができず、直接的な原因や解決策が見出せておりません。
エラーメッセージ
error
1このGoogle ユーザーアカウントでは、同時に実行中のスクリプトが多すぎます。
該当のソースコード
function doPost(e) { sendJudgeResult(e); // リザルト送信 return renderHtml('index', e); } function renderHtml(page, e) { const template = HtmlService.createTemplateFromFile(page); template.deployURL = ScriptApp.getService().getUrl(); const htmlOutput = template.evaluate(); htmlOutput.addMetaTag('viewport', 'width=device-width, initial-scale=1'); return htmlOutput; } function sendJudgeResult(e) { const judgeResult = [new Date(), e.parameter.bibNumber, e.parameter.problemNumber, e.parameter.result]; addRecords('ジャッジ入力', [judgeResult]); } function addRecords(sheetName, records) { // 競合対策ロック const lock = LockService.getScriptLock(); lock.waitLock(30000); try { const ss = SpreadsheetApp.openById("SPREADSHEETID"); const sheet = ss.getSheetByName(sheetName); records.forEach(record => { sheet.appendRow(record); // 競合を避けるため、appendRowを使用 }); //変更を即時反映 SpreadsheetApp.flush(); } finally { lock.releaseLock(); } }
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
https://developers.google.com/apps-script/guides/services/quotas?hl=ja
こちらの制限事項を見るとユーザーあたりの同時実行数30/ユーザーとなっています。
バッチで1回に送信するリクエスト数30とし、1秒間隔で計500リクエスト送るストレステストを実施していましたが、エラーは発生しませんでした。
補足
特になし

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2025/03/10 06:39