前提
LINE bot初心者です。
LINEbotで診断テストを作っているのですが、スプレッドシートに書かれた結果を読み取り、送信することができず困っています。アドバイスなど教えて頂けると嬉しいです。
実現したいこと
-
「Shitsumon_2」のテンプレートボタンをメッセージとして送信→成功
-
LINE側で「Shitsumon_2」の選択ボタンを押す。→成功
-
選択肢1の場合、「result_ok_1」へイベントを送る。
-
「getdatafromSheet」にeventと「result_ok_1」のデータを送る。
3と4のように、選択肢に合った回答をスプレッドシートから読み取り、結果をメッセージとして送信したいのですが、ボタンを押してもLINE botから応答がなく困っています。解決策やアドバイスなどありましたら、教えて頂けると嬉しいです。
発生している問題・エラーメッセージ
実行後、エラーはないのですが、別のスプレッドシートのlogは何も記載されず、LINE botの応答がありません。
該当のソースコード
JavaScript
1const CHANNEL_ACCESS_TOKEN = "F3a+******Xj5RDIIWFm/FstrDv/pRPCHpcsm8ulh9XWGpJHjbfXEKhlYczFfdLlvcmUz61BB6eiuAj9l2pgp2/FyXnyBJbBdO5dDYIbiuMw0Uu8x2s8XQeOexUDJHqjI5bggI5gdB04t89/1O/w1cDnyilFU="; 2const url = "https://api.line.me/v2/bot/message/reply"; 3const spreadsSheet = SpreadsheetApp.openById("****GJFdlDY5Zs72mH293qM_qIGynSTk"); 4 5const push_url = "https://api.line.me/v2/bot/message/push"; 6 7function doPost(e) { 8 try { 9 doPostProxy(e); 10 } catch (err) { 11 debug(JSON.stringify(err.stack || err.message, undefined, 1)); 12 }//例外処理 13} 14//dopostの関数定義 15function doPostProxy(e) { 16 var json = e.postData.contents 17 //返信するためのJSONの取得 18 var events = JSON.parse(json).events; 19 events.forEach(function (event) { 20 if (event.type == "follow") {//① 21 shokaibun_1(event);//①→2 22 }//相手が友達追加したら場合のみ起きる。 23 else if (event.type == "message"){ 24 var reply_message = event.message.text; 25 //shokaibun_1(event); 26 if("スタート" === reply_message) { 27 var reply_message = event.message.text; 28 shitsumon_2(event); 29 } 30 } 31 32//ここからスプレッドシート「rensyu」用のコード 33 else if(event.type == "postback"&& JSON.parse(event.postback.data).action==="aite_senpai"){//(38) 34 getresultFromSheet(event,result_ok_1(event)); 35 }else if(event.type == "postback"&& JSON.parse(event.postback.data).action==="aite_kohai"){//(38) 36 getresultFromSheet(event,result_ok_2(event)); 37 } 38 if (typeof replyToken === 'undefined') { 39 return; 40 } 41 } 42 ); 43}; 44 //質問文2 45 function shitsumon_2(e) {//(5) 46 let Msg2 = { 47 "replyToken" : e.replyToken, 48 "messages" : [ 49 { 50 "type": "template", 51 "altText": "選択", 52 "template": { 53 "type": "buttons", 54 "title": "誰に送る?", 55 "text": "誰に送る?", 56 "actions": [ 57 { 58 "type": "postback", 59 "label": "選択1", 60 "text": "送る相手は\n選択1", 61 "data": JSON.stringify({"action":"aite_senpai"}) 62 }, 63 { 64 "type": "postback", 65 "label": "選択2", 66 "text": "送る相手は\n選択2", 67 "data": JSON.stringify({"action":"aite_kohai"}) 68 } 69 ] 70 } 71 } 72 ] 73 }; 74 75 let pro_2 = { 76 "method" : "post", 77 "headers" : { 78 "Content-Type" : "application/json", 79 "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN 80 }, 81 82 "payload" : JSON.stringify(Msg2) 83 }; 84 var response = UrlFetchApp.fetch(url, pro_2); 85 // return response.getResponseCode(); 86 return ContentService.createTextOutput(JSON.stringify({ 87 'content': 'post ok' 88 })).setMimeType(ContentService.MimeType.JSON); 89 }; 90//最終選択まとめ1 91function result_ok_1(e){ 92 var sheet = spreadsSheet.getSheetByName('rensyu'); 93 //スプレッドシートの読み込み 94 var replytextList1 = sheet.getRange('D2').getValue();//D2のデータを設定。 95 //シートの全受信語句と返信語句を二次元配列で取得する//(2,8)→(2,45):F45まで 96 //返信語句を格納するための空配列を宣言する 97 return replytextList1; 98}; 99//最終選択まとめ2 100function result_ok_2(e){ 101 var sheet = spreadsSheet.getSheetByName('rensyu'); 102 //スプレッドシートの読み込み 103 var replytextList1 = sheet.getRange('D3').getValue();//D3のデータを設定。 104 //シートの全受信語句と返信語句を二次元配列で取得する//(2,8)→(2,45) 105 //返信語句を格納するための空配列を宣言する 106 return replytextList1; 107}; 108 109//スプレッドシートの中の結果を配列に移動させ、出力するプログラム 110function getresultFromSheet(e,replyTextList){ 111 //var reply_token = data.events[0].replyToken;//→replyTOkenの引き渡しとeventの設定(12/26) 112 //LINEで受信した語句がシートの受信語句と一致しない場合、関数を終了する 113 if(replyTextList.length < 1) { 114 return;//何もセル内にテキストが含まれていないとき 115 } else if(replyTextList.length > 5) {//5個以上のメッセージがセルの中に含まれているとき 116 var messageLength = 5; 117 } else {//1つ以上5個未満のメッセージがセルの中に含まれている時 118 var messageLength = replyTextList.length; 119 } 120 var messageArray = []; 121 122 for(var j = 0; j < messageLength; j++) { 123 messageArray.push({"type": "text", "text": replyTextList[j]}); 124 } 125 var postData = { 126 "replyToken" : e.replyToken, 127 "messages" : messageArray, 128 }; 129 let option1 = { 130 "method" : "post", 131 "headers" : { 132 "Content-Type" : "application/json", 133 "Authorization" : "Bearer " + CHANNEL_ACCESS_TOKEN 134 }, 135 "payload" : JSON.stringify(postData), 136 "muteHttpExceptions" : true, 137 "validateHttpCertificates" : false, 138 "followRedirects" : false 139 }; 140 try{ 141 var response = UrlFetchApp.fetch(push_url, option1); 142 Logger.log(response); 143 144 }catch(e) { 145 // 例外エラー処理 146 Logger.log("Error:"); 147 Logger.log(e); 148 } 149 }; 150 151//エラー処理 152function debug(message) { 153 spreadsSheet.getSheetByName('log').appendRow([message]); 154} 155 156 157
試したこと
・編集後、新しくデプロイしWebhookのURLを更新。
・スプレッドシート名、URLの確認
補足情報(FW/ツールのバージョンなど)
参考にしたサイト:
- https://uxmilk.jp/25841「スプレッドシートの読み取り方法についてまとめられたもの」
- https://www.yukibnb.com/entry/linemessagingapi_sheet#%E8%A4%87%E6%95%B0%E3%81%AE%E5%90%B9%E3%81%8D%E5%87%BA%E3%81%97%E3%82%92LINE-BOT%E3%81%AB%E8%BF%94%E4%BF%A1%E3%81%95%E3%81%9B%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88「スプレッドシートの一つのセル内に複数の文字が含まれている場合の読み取りと出力方法についてまとめられたもの」
スプレッドシートはこのようになっています。
コードを書き換える度、デプロイとWebhookのURLを新しく更新しています。
アクセスするユーザーは全員としました。
LINE botでのメッセージの取得、カーセルボタンによる分岐は上手くいったのですが、スプレッドシートに書かれた結果を取得し、送ることがうまく出来ず困っています。
お手隙の方、解決方法等、ご教示頂きたいです。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー