前提
gasで簡単な発注フォームを作成しています。
チェックボックス形式で複数の商品を選択することができるフォームです↓
複数商品が発注された場合は、スプレッドシートに商品と金額が一行ずつ記入されていきます↓
普段は良いのですが、購入申込が混み合ってくると前の人と後の人とで最終行がダブってしまい、前の人の注文が後の人の注文で上書きされてしまい、スプレッドシートから消えてしまいます。
※15時丁度にAさんとBさんが同時に同じフォームからそれぞれの端末でフォーム送信すると、Aさんの購入商品とBさんの購入商品を記載する最終行がダブってしまう、というイメージです。
該当のソースコード
GAS
1function SendSS(e) { 2 3FormApp.getActiveForm(); 4var itemResponses = e.response.getItemResponses(); 5var result=[]; 6 7 for (var i=0;i< itemResponses.length; i++){ 8 9 var itemResponse = itemResponses[i]; 10 var answer=itemResponse.getResponse(); 11 result.push(answer); 12 } 13 14//配列の回答を文字列に直す 15for(var i=0;i<=result.length;i++){ 16 if(Array.isArray(result[i])){ 17 result[i]=result[i].join(); 18 } 19 } 20 21//購入者の情報 22var name = result[0]; 23var mail =result[1]; 24 25//商品を商品名と値段に区切る 26var _merchandises = result; 27_merchandises.splice(0,2); 28_merchandises=_merchandises.join(); 29_merchandises=_merchandises.replace(/,/g,"¥"); 30 31//商品名と値段の選択肢が記載された文字列を、"¥"で区切る 32var split =_merchandises.split("¥"); 33 34//商品名だけの配列を作る 35 var merchandises=[]; 36 for(var i=0;i<=split.length;i=i+2){ 37 merchandises.push([split[i]]); 38 } 39 40//価格だけの配列を作る 41 var price=[]; 42 for(var i=1;i<=split.length;i=i+2){ 43 price.push([split[i]]); 44 } 45 46 //スプレッドシートを定義 47 var ss = SpreadsheetApp.openById('XXXXXXXX'); 48 var sheet = ss.getSheetByName('一覧'); 49 50 //日付 51 var date = Utilities.formatDate(new Date(), 'Asia/Tokyo','yyyy/M/d'); 52 53 //この処理がダブらないようにロックしたい 54 var Lock = LockService.getScriptLock(); 55 try{ 56 Lock.waitLock(10000); 57 var lastRow = sheet.getLastRow()+1; 58 //一行一行シートに貼り付け 59 for (var i=0;i<=merchandises.length-2;i++){ 60 var Setmerchandise = merchandises[i]; 61 var Setplice = price[i]; 62 sheet.getRange(lastRow+i, 1, 1, 4).setValues([[date,name,Setmerchandise,Setplice]]); 63 } 64 Lock.releaseLock(); 65 }catch{ 66 //slackへのエラーメッセージ 67 } 68}
試したこと
if文を使って
if(Lock.tryLock(10000)){ //ここにfor文 }else{ //slackにエラーメッセージ }
の処理やwhile文を使った
var lock = LockService.getScriptLock(); var maxRetryCount = 5; // 最大リトライ回数 var retryInterval = 500; // リトライ間隔(ミリ秒) var retryCount = 0; while (!lock.tryLock(10000)) { retryCount++; if (retryCount >= maxRetryCount) { // リトライ回数が上限に達した場合はエラーメッセージを表示して終了 Logger.log('ロックの取得に失敗しました。他の処理が実行中かもしれません。'); return; } // リトライ間隔を待機 Utilities.sleep(retryInterval); } }else{ //slackにエラーメッセージ }
などのパターンも試してみたのですが、二つのウインドウで同時にフォーム送信すると、最終行の数字がどうしてもダブってどちらかの回答が上書きされてしまいます。

0 コメント