スプレッドシート CGI版でエクスポートされないデータがある

msさん (2022-08-23 14:41:09) www.sugano-test.com/mtest2208/

いつも大変お世話になっています。

Googleスプレッドシート(CGI版)の機能を使用しているのですが、
通し番号で抜けている番号があることに気付きました。
確認したところ、
設置者に届くメールと自動返信メールは届いているのですが、
スプレッドシートにはその内容の1行がありません。

どうしてかといろいろ試してみると、
複数の人が同時(秒まで一緒のタイミング)に送信をすると、
その中のどれか1件のみしか、Googleスプレッドシートに入らないようでした。
そのような仕様なのか、それともどこか設定が違っているのでしょうか…。

configのモジュールの設定はコメントアウト済み。
同時にならなければ、問題なくエクスポートできています。
サーバーはxサーバーです。
使用しているバージョンは4.3.0です。


ちなみにthanksページからスプレッドシートへエクスポートする版の方は、
1度送信した後に画面をbackで戻ってまたthanksページに…というようにすると
同じものが何件もスプレッドシートにエクスポートされるため、
CGI版の方を使用しています。

よろしくお願いいたします。

設定の誤りではないと思います

和田 (2022-08-25 12:49:11) www.synck.com

ID等を付与しているわけではないので衝突という可能性はないと思いますので、Googleスプレッドシート側の仕様的なものかもしれません・・・。

お返事ありがとうございます

msさん (2022-09-02 08:38:23) www.sugano-test.com/mtest2208/

そうなのですね…google側が1度にまとめてデータは受け取れないとかなのかもしれませんね。
セキュリティ上のこともあり候補から外していたCSV保存機能か、もしくは抜けている分は手入力で対応したいと思います。ありがとうございます!

お役に立てずすいません・・・

和田 (2022-09-05 10:04:02) www.synck.com

時間差で同期させるような仕組みをご用意できればよいのですが、ちょっと回避策がなにか用意できないか考えてみます!次期アップデートにご期待ください!

GASの排他制御をすることで回避できました

加藤 光さん (2023-05-23 13:30:04) www.yuzu-system.com

同じ問題で調べていたところ、ほぼ同時に送信が合った場合スプレッドシートの同じ行に書き込みしていることがわかりました。
排他制御を追加することで解決できたので共有します。
function doPost(e){
let lock = LockService.getScriptLock();
if (lock.tryLock(5000)) { //5秒間他の処理が終わるのを待ち
var sheet = SpreadsheetApp.openById(e.parameter.SPREADSHEET_ID).getSheetByName(e.parameter.SHEET_NAME);
.
.
.
.
return ContentService.createTextOutput( ’(’ + return_json + ’)’).setMimeType(ContentService.MimeType.JAVASCRIPT);
lock.releaseLock(); //ロックを解除
};
};

すいません、対策までつくっていただいて・・・

和田 (2023-05-29 21:35:20) www.synck.com

普通に衝突していたのですね…。すいませんテキトーな回答をしてしまいまして…。そして解決策まで本当にありがとうございます・・・。未熟者ですいません・・・・。