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

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

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

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

Google スプレッドシート

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

JavaScript

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

Q&A

解決済

3回答

1466閲覧

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

two_back_low

総合スコア20

LINE Messaging API

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

Google スプレッドシート

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

JavaScript

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

0グッド

0クリップ

投稿2021/10/08 07:09

編集2021/10/08 07:25

前提・実現したいこと

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

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

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

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

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

該当のソースコード

javascript

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

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

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

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

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

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

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

guest

回答3

0

自己解決

GAS

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 };

上記を送信関数に追記

以下全文

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 57var 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 69 //replyTypeのLengthが5より大きい場合、messageLengthを5にする 70 //※※一度に最大5つの吹き出ししか返信できないため※※ 71 } else if(replyType.length > 5) { 72 var messageLength = 5; 73 } else { 74 var messageLength = replyType.length; 75 } 76 77 //"messages"に渡す配列を格納するための空配列を宣言する 78 var messageArray = []; 79 80 //replyTypeに格納されている返信メッセージのタイプと 81 //replyListに格納されている返信メッセージを最大5つ、 82 //messageArrayにpushする 83 for(var j = 0; j < messageLength; j++) { 84 switch (replyType[j]) { 85 case "text": 86 messageArray.push({"type": replyType[j], "text": replyList[j][2]}); 87 break; 88 89 case "sticker": 90 messageArray.push({"type": replyType[j], "packageId": replyList[j][3], "stickerId": replyList[j][4]}); 91 break; 92 93 case "image": 94 messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); 95 break; 96 97 case "video": 98 messageArray.push({"type": replyType[j], "originalContentUrl": replyList[j][5], "previewImageUrl": replyList[j][6]}); 99 break; 100 101 //replyList[j][2]はJSON.parseを使ってパースする必要がある 102 case "flex": 103 messageArray.push({"type": replyType[j], "altText": "this is a flex message", "contents": JSON.parse(replyList[j][2])}); 104 break; 105 } 106 } 107 108sendMessage(messageArray, reply_token); 109} 110 111// メッセージ送信関数 112// messageArrayは配列 113function sendMessage(messageArray, reply_token) { 114 var replyUrl = "https://api.line.me/v2/bot/message/reply"; // 追加する 115 var headers = { 116 "Content-Type": "application/json; charset=UTF-8", 117 Authorization: "Bearer " + LINE_ACCESS_TOKEN, 118 }; 119 120 var postData = { 121 replyToken: reply_token, 122 messages: messageArray, 123 }; 124 125 var options = { 126 method: "post", 127 headers: headers, 128 payload: JSON.stringify(postData), 129 }; 130 131 //LINE Messaging APIにデータを送信する 132 UrlFetchApp.fetch(replyUrl, options); 133}

投稿2021/10/14 06:58

two_back_low

総合スコア20

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

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

0

追加回答

あまり綺麗なコードではありませんがこれでどうでしょう?

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}

投稿2021/10/08 08:15

編集2021/10/08 08:41
S.Hashimoto

総合スコア65

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

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

two_back_low

2021/10/08 08:38

ありがとうございます。 開発環境がないのでGASを公開して動作確認してみましたが、、任意の語句がpushされませんでした( ;∀;)
two_back_low

2021/10/08 08:39

LINEで受信した語句がシートの受信語句と同じ場合はスプレッドシートに登録の語句は返信されました。
two_back_low

2021/10/08 11:57

追加編集ありがとうございます。 今度はシートに登録している語句にも返信しなくなってしまいました(´;ω;`)
guest

0

replyTypeのLengthが5より大きい場合、messageLengthを5にする

の条件を残すのであれば、以下のコードを

gas

1 //LINEで受信した語句がシートの受信語句と一致しない場合、関数を終了する 2 if(replyType.length < 1) { 3 return; 4 5 //replyTypeのLengthが5より大きい場合、messageLengthを5にする 6 //※※一度に最大5つの吹き出ししか返信できないため※※ 7 } else if(replyType.length > 5) { 8 var messageLength = 5; 9 } else { 10 var messageLength = replyType.length; 11 }

以下で上書きすれば動作するはずです

gas

1 //replyTypeのLengthが5より大きい場合、messageLengthを5にする 2 //※※一度に最大5つの吹き出ししか返信できないため※※ 3    if(replyType.length > 5) { 4 var messageLength = 5; 5 } else { 6 var messageLength = replyType.length; 7 }

投稿2021/10/08 07:20

S.Hashimoto

総合スコア65

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

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

two_back_low

2021/10/08 07:55

質問内容が不透明で申し訳ありません。 スプレッドシートに登録している語句に一致しなかった場合に、任意の語句を返答する場合が知りたいのです。。
S.Hashimoto

2021/10/08 08:13

なるほどです、、追記いたします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問