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

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

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

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

Q&A

解決済

1回答

887閲覧

line bot でスプレッドシートの語句(複数列)を応答したい。GAS使用。

BBA

総合スコア60

LINE Messaging API

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

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

0グッド

0クリップ

投稿2022/09/21 08:09

GASを使用しスプレッドシートの語句を返信するLINE BOTを作成してます。

【シリーズ第4話】コピペでOK!スプレッドシートの語句を返信するLINE BOTをGASで作成する方法(実践編)

を参考に作成しました。
このままのコードではうまくいきましたが、アレンジしたく検討中です。

複数の列の返答をしたいです。

イメージ説明

A3の「も」を送信すると、B3の「じょ」とC3の「ファ」が返信されるようにしたいです。

コード

gas

1 2 3//★★LINE Messaging APIのチャネルアクセストークン★★ 4var LINE_ACCESS_TOKEN = "*********"; 5 6//★★スプレッドシートID★★ 7var ss = SpreadsheetApp.openById("***********"); 8 9//★★シート名★★ 10var sh = ss.getSheetByName("a"); 11 12 13//LINE Messaging APIからPOST送信を受けたときに起動する 14// e はJSON文字列 15function doPost(e){ 16 if (typeof e === "undefined"){ 17 //動作を終了する 18 return; 19 } else { 20 //JSON文字列をパース(解析)し、変数jsonに格納する 21 var json = JSON.parse(e.postData.contents); 22 23 //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する 24 replyFromSheet(json) 25 } 26} 27 28//返信用の関数replyFromSheet 29// data には変数jsonが代入される 30function replyFromSheet(data) { 31 //返信先URL 32 var replyUrl = "https://api.line.me/v2/bot/message/reply"; 33 34 //シートの最終行を取得する 35 var lastRow = sh.getLastRow(); 36 37 //シートの全受信語句と返信語句を二次元配列で取得する 38 var wordList = sh.getRange(1,1,lastRow,3).getValues(); 39 40 //受信したメッセージ情報を変数に格納する 41 var reply_token = data.events[0].replyToken; //reply token 42 var text = data.events[0].message.text; //ユーザーが送信した語句 43 44 //返信語句を格納するための空配列を宣言する 45 var replyTextList = []; 46 47 //LINEで受信した語句がシートの受信語句と同じ場合、返信語句をreplyTextにpushする 48 for(var i = 1; i < wordList.length; i++) { 49 if(wordList[i][0] == text) { 50  replyTextList.push(wordList[i][1:2]); 51 } 52 } 53 54 55 //LINEで受信した語句がシートの受信語句と一致しない場合、関数を終了する 56 if(replyTextList.length < 1) { 57 return; 58 59 //replyTextListのLengthが5より大きい場合、messageLengthを5にする 60 //※※一度に最大5つの吹き出ししか返信できないためです※※ 61 } else if(replyTextList.length > 5) { 62 var messageLength = 5; 63 } else { 64 var messageLength = replyTextList.length; 65 } 66 67 //"messages"に渡す配列を格納するための空配列を宣言する 68 //[{"type": "text", "text": "返信語句その1"},{"type": "text", "text": "返信語句その2"}....] 69 var messageArray = []; 70 71 //replyTextListに格納されている返信語句を最大5つ、messageArrayにpushする 72 for(var j = 0; j < messageLength; j++) { 73 messageArray.push({"type": "text", "text": replyTextList[j]}); 74 } 75 76 var headers = { 77 "Content-Type": "application/json; charset=UTF-8", 78 "Authorization": "Bearer " + LINE_ACCESS_TOKEN, 79 }; 80 81 var postData = { 82 "replyToken": reply_token, 83 "messages": messageArray 84 }; 85 86 var options = { 87 "method" : "post", 88 "headers" : headers, 89 "payload" : JSON.stringify(postData) 90 }; 91 92 //LINE Messaging APIにデータを送信する 93 UrlFetchApp.fetch(replyUrl, options); 94} 95 96 97

試したコード

gas

1 //シートの全受信語句と返信語句を二次元配列で取得する 2 //試したコード 3var wordList = sh.getRange(1,1,lastRow,3).getValues(); 4 //もとのコード 5 var wordList = sh.getRange(1,1,lastRow,2).getValues(); 6 7 8 //LINEで受信した語句がシートの受信語句と同じ場合、返信語句をreplyTextにpushする 9 for(var i = 1; i < wordList.length; i++) { 10 //試したコード 11 if(wordList[i][0] == text) { 12  replyTextList.push(wordList[i][1][2]);←ここの表記?が問題かなと 13 } 14 }

getRangeは下記のサイトを参考にしました。
参考
replyTextList.push(wordList[i][1]);の方が検索してもなかなか出てこず困ってます。

助けていただけると幸いです。

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

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

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

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

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

YAmaGNZ

2022/09/21 08:29 編集

wordList[i][1][2]と書いてもwordList[i][1]とwordList[i][2]が連結される訳ではありません。 配列など基本的な文法を学習されるべきかと思います。 また、ご自身の作成されたものでどうなるのか詳細に(ここでこういうエラーが出るとか)書きましょう。
YAmaGNZ

2022/09/21 09:59

>replyTextList.push(wordList[i][1]);の方が検索してもなかなか出てこず困ってます。 ちなみにどのようなキーワードで検索していますか?
BBA

2022/09/22 01:23

wordList[i][1][2]きっと違うだろなと思いながらとりあえず、試しました。すみません。 gasの基本まとめのサイトなど読んでみましたが、配列についても調べてみます。 検索は、gas push で検索したり、replyTextList.pushを検索したりしました。
guest

回答1

0

自己解決

コメント読んで、配列について調べてみました。
配列などをみました。

【GAS】一次元配列の結合で新たな配列を作る/配列要素を結合する
のなかのjoinメソッドを使って、コードを書き換えてみました。

gas

1参考joinメソッド 2let array = ['apple', 'orange', 'grape']; 3 4 console.log(array.join(' and ')); // apple and orange and grape 5 console.log(array.join('-')); // apple-orange-grape

gas

1 if(wordList[i][0] == text) { 2 let wordtext = [wordList[i][1],wordList[i][2]] 3 4 replyTextList.push(wordtext.join(' '));

でテキストを結合でき、応答もできました。
ヒント下さってありがとうございました。

投稿2022/09/22 04:33

BBA

総合スコア60

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

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

YAmaGNZ

2022/09/23 22:17

2個くらいであれば replyTextList.push(wordList[i][1] + ' ' + wordList[i][2]); でもいいかと思います。
BBA

2022/09/25 03:59

なるほど。遠回りしてました。そんな書き方があったんですね。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問