前提・実現したいこと
非エンジニアながらスプレッドシートと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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/12 04:44 編集