質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1071閲覧

GAS LINEBOT スプレッドシートに複数LINEで同時送信するとセルが上書きされてしまいます。

Hmasahero2

総合スコア10

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/06/24 08:25

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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LIFFでHTMLフォーム(Googleフォーム内蔵)作って回答させるほうが作成側もユーザーも楽な気が。。

ユーザーIDを他に投げるのもIDトークン取得する方法が正しいやり方みたいですし(LINE Q&Aで社員さんらしき人がそう言われてました)

投稿2020/06/24 10:13

MasakiTM

総合スコア115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問