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

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

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

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

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

Q&A

解決済

1回答

936閲覧

【GAS】LINEbotでスプレッドシートに登録してない受信語句に任意の言葉を返答させたい

two_back_low

総合スコア20

LINE Messaging API

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

Google スプレッドシート

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

Google Apps Script

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

JavaScript

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

0グッド

0クリップ

投稿2021/10/12 02:35

編集2021/10/12 02:55

前提・実現したいこと

非エンジニアながらスプレッドシートとGASを使いLINEbotを作成してます。

スプレッドシートに登録している語句に一致しなかった場合に、任意の語句、例えば__「質問の答えがありません。ほかの質問をお願いします。」__と返答させたい場合のコードをご教示ください。

発生している問題・エラーメッセージ

この部分
終了させずに任意の語句を送信させるときのコードを教えてください。

GAS

1//LINEで受信した語句がシートの受信語句と一致しない場合、関数を終了する 2 if(replyType.length < 1) { 3 return;

該当のソースコード

GAS

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

試したこと

以下参照しながら載っているとおりに動作しました。
https://www.yukibnb.com/entry/linemessagingapi_gas_sticker

以下コードで試しましたが、既読のみ付いて返信がされませんでした。

GAS

1//★★LINE Messaging APIのチャネルアクセストークン★★ 2var LINE_ACCESS_TOKEN = "チャネルアクセストークンをここに入力"; 3 4//★★スプレッドシートID★★ 5var ss = SpreadsheetApp.openById("スプレッドシートIDをここに入力"); 6 7//★★シート名★★ 8var sh = ss.getSheetByName("シート名をここに入力"); 9 10//LINEからPOSTリクエストを受けたときに起動する 11//eはJSON文字列 12function doPost(e) { 13 if (typeof e === "undefined") { 14 //動作を終了する 15 return; 16 } else { 17 //JSON文字列をパース(解析)し、変数jsonに格納する 18 var json = JSON.parse(e.postData.contents); 19 20 //変数jsonを関数replyFromSheetに渡し、replyFromSheetを実行する 21 replyFromSheet(json); 22 } 23} 24 25//返信メッセージ作成の関数replyFromSheet 26//dataには変数jsonが代入される 27function replyFromSheet(data) { 28 //返信先URL 29 var replyUrl = "https://api.line.me/v2/bot/message/reply"; 30 31 //シートの最終行を取得する 32 var lastRow = sh.getLastRow(); 33 34 //シートのA~G列を二次元配列で取得する 35 var wordList = sh.getRange(1, 1, lastRow, 7).getValues(); 36 37 //受信したメッセージ情報を変数に格納する 38 var reply_token = data.events[0].replyToken; //reply token 39 var text = data.events[0].message.text; //ユーザーが送信した語句 40 41 //返信メッセージのタイプを格納するための空配列を宣言する 42 var replyType = []; 43 44 //返信メッセージを格納するための空配列を宣言する 45 var replyList = []; 46 47 //LINEで受信した語句がシートの受信語句と同じ場合、 48 //返信メッセージのタイプをreplyTypeにpushし、 49 //さらにその行のA列~G列をreplyListにpushする 50 for (var i = 1; i < wordList.length; i++) { 51 if (wordList[i][0] == text) { 52 replyType.push(wordList[i][1]); 53 replyList.push(wordList[i]); //ポイント: 一次元配列をpushする 54 } 55 } 56 57 var messageArray = []; 58 //LINEで受信した語句がシートの受信語句と一致しない場合、messageを送信して関数を終了する 59 if (replyType.length < 1) { 60 var message = "質問の答えがありません。ほかの質問をお願いします。"; 61 messageArray.push({ 62 type: "text", 63 text: message, 64 }); 65 sendMessage(messageArray, reply_token); 66 return; 67 68 //replyTypeのLengthが5より大きい場合、messageLengthを5にする 69 //※※一度に最大5つの吹き出ししか返信できないため※※ 70 } else if (replyType.length > 5) { 71 var messageLength = 5; 72 } else { 73 var messageLength = replyType.length; 74 } 75 76 //"messages"に渡す配列を格納するための空配列を宣言する 77 var messageArray = []; 78 79 //replyTypeに格納されている返信メッセージのタイプと 80 //replyListに格納されている返信メッセージを最大5つ、 81 //messageArrayにpushする 82 for (var j = 0; j < messageLength; j++) { 83 switch (replyType[j]) { 84 case "text": 85 messageArray.push({ 86 type: replyType[j], 87 text: replyList[j][2], 88 }); 89 break; 90 91 case "sticker": 92 messageArray.push({ 93 type: replyType[j], 94 packageId: replyList[j][3], 95 stickerId: replyList[j][4], 96 }); 97 break; 98 99 case "image": 100 messageArray.push({ 101 type: replyType[j], 102 originalContentUrl: replyList[j][5], 103 previewImageUrl: replyList[j][6], 104 }); 105 break; 106 107 case "video": 108 messageArray.push({ 109 type: replyType[j], 110 originalContentUrl: replyList[j][5], 111 previewImageUrl: replyList[j][6], 112 }); 113 break; 114 115 //replyList[j][2]はJSON.parseを使ってパースする必要がある 116 case "flex": 117 messageArray.push({ 118 type: replyType[j], 119 altText: "this is a flex message", 120 contents: JSON.parse(replyList[j][2]), 121 }); 122 break; 123 } 124 } 125 126 sendMessage(messageArray, reply_token); 127} 128 129// メッセージ送信関数 130// messageArrayは配列 131function sendMessage(messageArray, reply_token) { 132 var headers = { 133 "Content-Type": "application/json; charset=UTF-8", 134 Authorization: "Bearer " + LINE_ACCESS_TOKEN, 135 }; 136 137 var postData = { 138 replyToken: reply_token, 139 messages: messageArray, 140 }; 141 142 var options = { 143 method: "post", 144 headers: headers, 145 payload: JSON.stringify(postData), 146 }; 147 148 //LINE Messaging APIにデータを送信する 149 UrlFetchApp.fetch(replyUrl, options); 150}

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行はしていないのですが、ソースを読む限り、sendMessage関数の中で、replyUrlが定義されておらず、エラーが発生してそれ以降処理が進んでいないのではないでしょうか。

したがって下記のように、replyUrlを定義してやる必要があると思います。

(他のソースに現れていない所でエラーが残っているかもしれませんが)

diff

1function sendMessage(messageArray, reply_token) { 2+ var replyUrl = "https://api.line.me/v2/bot/message/reply"; // 追加する 3 var headers = { 4 "Content-Type": "application/json; charset=UTF-8", 5 Authorization: "Bearer " + LINE_ACCESS_TOKEN, 6 }; 7以下略

投稿2021/10/12 04:06

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

two_back_low

2021/10/12 04:44 編集

メッセージ送信関数に記載のコードを追加し実行しましたところ ご指摘通りの処理が完了いたしました。 丁寧なご説明ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問