GASとLINEBOTで体温集計BOTを作成しているのですが
LINEの方で同時に入力送信を行うと同じセルで更新されてしまいセルが上書きされてしまいます
記述をする前にスプレッドシートを更新したりすればいいのかと思ったのですが
Spreatsheet.flush();
や
Utilities.sleep();
こちらをランダムにしてずらしてもたまにかぶってしまって上書きされてしまいます。
他にいい方法を教えてもらえると助かります
const LINE_TOKEN = // Messaging API設定の一番下で発行できるLINE Botのアクセストークン(Channel Secretはいらないみたいです。) const LINE_URL = ; // *************************** // スプレットシートからデータを抽出 // *************************** // 1. 今開いている(紐付いている)スプレッドシートを定義 const sheet = SpreadsheetApp.getActiveSpreadsheet(); // 2. ここでは、デフォルトの「シート1」の名前が書かれているシートを呼び出し const listSheet = sheet.getSheetByName("シート1"); // 3. 最終列の列番号を取得 const numColumn = listSheet.getLastColumn(); // 4. 最終行の行番号を取得 const numRow = listSheet.getLastRow()-1; // 5. 範囲を指定(上、左、右、下) const topRange = listSheet.getRange(1, 1, 1, numColumn); // 一番上のオレンジ色の部分の範囲を指定 const dataRange = listSheet.getRange(2, 1, numRow, numColumn); // データの部分の範囲を指定 // 6. 値を取得 const topData = topRange.getValues(); // 一番上のオレンジ色の部分の範囲の値を取得 const data = dataRange.getValues(); // データの部分の範囲の値を取得 const dataNum = data.length +2; // 新しくデータを入れたいセルの列の番号を取得 // 2. ここでは、デフォルトの「シート2」の名前が書かれているシートを呼び出し const listSheet2 = sheet.getSheetByName("シート2"); // 3. 最終列の列番号を取得 const numColumn2 = listSheet2.getLastColumn(); // 4. 最終行の行番号を取得 const numRow2 = listSheet2.getLastRow()-1; // 5. 範囲を指定(上、左、右、下) const topRange2 = listSheet2.getRange(1, 1, 1, numColumn2); // 一番上のオレンジ色の部分の範囲を指定 const dataRange2 = listSheet2.getRange(2, 1, numRow2, numColumn2); // データの部分の範囲を指定 // 6. 値を取得 const topData2 = topRange2.getValues(); // 一番上のオレンジ色の部分の範囲の値を取得 const data2 = dataRange2.getValues(); // データの部分の範囲の値を取得 const dataNum2 = data2.length +2; // 新しくデータを入れたいセルの列の番号を取得 //postリクエストを受取ったときに発火する関数 function doPost(e) { const event = JSON.parse(e.postData.contents).events[0]; //返信するためのトークン取得 // 応答用Tokenを取得 const replyToken = JSON.parse(e.postData.contents).events[0].replyToken; if (typeof replyToken === 'undefined') { return; } // メッセージを取得 const userMessage = JSON.parse(e.postData.contents).events[0].message.text; //メッセージを改行ごとに分割(使ってない) const all_msg = userMessage.split("\n"); const msg_num = all_msg.length; //ユーザーID獲得 const user_id = event.source.userId const New_Id_Flag = 0; // *************************** // スプレッドシートにデータを入力 // *************************** //返答用メッセージを作成 var reply_messages; for (let j = 1; j < dataNum; j++) { //ユーザーIDがすでにリストにあるか if(listSheet.getRange(j, 3).getValue() == user_id) { //進行状態チェック switch(findLastCol(j)) { case 4: listSheet.getRange(j,findLastCol(j)+1 ).setValue(userMessage); reply_messages = ['ありがとうございます\n次に今の体温を教えて下さい']; LinePushText(replyToken,reply_messages); break; default://シート2に入力 listSheet2 = sheet.getSheetByName("シート2"); //今の時間を入力 listSheet2.getRange(dataNum2, 1).setValue(Utilities.formatDate(new Date(),'Asia/Tokyo', 'YYYY/MM/dd')); //今の時間を入力 listSheet2.getRange(dataNum2, 2).setValue(Utilities.formatDate(new Date(),'Asia/Tokyo', 'HH:mm')); //ユーザーIDを入力 listSheet2.getRange(dataNum2, 3).setValue(user_id); //名前を入力 listSheet2.getRange(dataNum2, 4).setValue(userMessage); reply_messages = [Utilities.formatDate(new Date(),'Asia/Tokyo', 'YYYY/MM/dd HH:mm')+'は、'+userMessage+'℃ですね\nありがとうございます']; LinePushText(replyToken,reply_messages); break; } //リストにユーザーIDあったよフラグ New_Id_Flag = 1; break; } } //まだ一回も投稿されてないか確認 if(New_Id_Flag == 0) { //今の日付を入力 listSheet.getRange(dataNum, 1).setValue(Utilities.formatDate(new Date(),'Asia/Tokyo', 'YYYY/MM/dd')); //今の時間を入力 listSheet.getRange(dataNum, 2).setValue(Utilities.formatDate(new Date(),'Asia/Tokyo', 'HH:mm')); //ユーザーIDを入力 listSheet.getRange(dataNum, 3).setValue(user_id); //名前を入力 listSheet.getRange(dataNum, 4).setValue(userMessage); reply_messages = ['ありがとうございます\n会員番号を教えて下さい']; // メッセージを返信 LinePushText(replyToken,reply_messages); } } //LINEで返信する関数 function LinePushText(replyToken,reply_messages) { var messages = reply_messages.map(function (v) { return {'type': 'text', 'text': v}; }); //lineで返答する UrlFetchApp.fetch(LINE_URL, { 'headers': { 'Content-Type': 'application/json; charset=UTF-8', 'Authorization': `Bearer ${LINE_TOKEN}`, }, 'method': 'post', 'payload': JSON.stringify({ 'replyToken': replyToken, 'messages': messages, }), }); ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); } //LINEに送信するようの文字に function pushText(text){ const after_msg = { 'type': 'text', 'text': text, } return after_msg; } /** * 指定行の「最終列の列番号」を返す * * @param {number} 行番号 * @return {number} 最終列の列番号 */ function findLastCol(row) { // 指定の行を二次元配列に格納する ※シート全体の最終行までとする var RowValues = listSheet.getRange(row, 1, 1, listSheet.getLastColumn()).getValues(); Logger.log(RowValues);// [[1, 2, 3, 4, ]] //二次元配列を一次元配列に変換する RowValues = Array.prototype.concat.apply([], RowValues); Logger.log(RowValues);// [1, 2, 3, 4, ] var lastCol = RowValues.filter(String).length; return lastCol;// 4 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。