https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca
上記のサイトを参考にGASでスプレッドシートからLINEの返信を返すbotを作っているのですが、最後debugシートへ値を記載する際、送ったテキストを転記したいと思っております。
素人ながらコードを読み、「postMsg」の部分を取り出すものと思い以下(test)のようにコードを変えましたが、LINEbotが返信しなくなり原因がわかりません。
希望の動作としては
LINEで
「りんご」と打つと
botが
「りんごは美味しい」
と返し、debugシートに
|UserID|UserName|テキスト|送信日時
|:--|:--:|--:|
|xxx|xxx|りんご|xxx
と記載されるようにしたいです。
ご教授いただけますようお願いいたします。
GoogleAppsScript
1// 利用しているシート 2var SHEET_ID = '(①スプレッドシートのIDをコピペ)'; 3// 利用しているSSのシート名(※変えるとみえなくなる) 4var SHEET_NAME = 'faq'; 5// 利用しているもしかしてSSのシート名(※変えるとみえなくなる) 6var SHEET_NAME_MAYBE = 'maybe'; 7 8// LINE Message API アクセストークン 9var ACCESS_TOKEN = '(②LINEのdevelopersアカウント上で取得したTOKENをコピペ)'; 10// 通知URL 11var PUSH = "https://api.line.me/v2/bot/message/push"; 12// リプライ時URL 13var REPLY = "https://api.line.me/v2/bot/message/reply"; 14// プロフィール取得URL 15var PROFILE = "https://api.line.me/v2/profile"; 16 17/** 18 * doPOST 19 * POSTリクエストのハンドリング 20 */ 21function doPost(e) { 22 var json = JSON.parse(e.postData.contents); 23 reply(json); 24} 25 26/** 27 * doGet 28 * GETリクエストのハンドリング 29 */ 30function doGet(e) { 31 return ContentService.createTextOutput("SUCCESS"); 32} 33 34/** 35 * reply 36 * ユーザからのアクションに返信する 37 */ 38function reply(data) { 39 // POST情報から必要データを抽出 40 var lineUserId = data.events[0].source.userId; 41 var postMsg = data.events[0].message.text; 42 var replyToken = data.events[0].replyToken; 43 var action = data.events[0].message.action; 44 // 記録用に検索語とuserIdを記録 45// debug(postMsg, lineUserId); 46 debug(action, lineUserId); 47 48 // 検索語に対しての回答をSSから取得 49 var answers = findResponseArray(postMsg); 50 51 // 回答メッセージを作成 52 var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。'; 53 // 回答の有無に応じて分岐 54 if (answers.length === 0) { 55 // 「類似の検索キーワード」がないかチェック 56 var mayBeWord = findMaybe(postMsg); 57 if (typeof mayBeWord === "undefined") { 58 // 回答がない場合の定型文 59 sendMessage(replyToken, '答えが見つかりませんでした。別のキーワードで質問してみてください。'); 60 } else { 61 sendMayBe(replyToken, mayBeWord); 62 } 63 } else { 64 // 回答がある場合のメッセージ生成 65 answers.forEach(function(answer) { 66 replyText = replyText + "\n\n=============\n\nQ:" + answer.key + "\n\nA:" + answer.value; 67 }); 68 69 // 1000文字を超える場合は途中で切る 70 if (replyText.length > 1000) { 71 replyText = replyText.slice(0,1000) + "……\n\n=============\n\n回答文字数オーバーです。詳細に検索キーワードを絞ってください。"; 72 } 73 // メッセージAPI送信 74 sendMessage(replyToken, replyText); 75 } 76} 77 78// SSからデータを取得 79function getData() { 80 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME); 81 var data = sheet.getDataRange().getValues(); 82 83 return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); 84} 85 86// SSから「もしかして」データを取得 87function getMayBeData() { 88 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_MAYBE); 89 var data = sheet.getDataRange().getValues(); 90 return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); 91} 92 93// 単語が一致したセルの回答を配列で返す 94function findResponseArray(word) { 95 // スペース検索用のスペースを半角に統一 96 word = word.replace(' ',' '); 97 // 単語ごとに配列に分割 98 var wordArray = word.split(' '); 99 return getData().reduce(function(memo, row) { 100 // 値が入っているか 101 if (row.value) { 102 // AND検索ですべての単語を含んでいるか 103 var matchCnt = 0; 104 wordArray.forEach(function(wordUnit) { 105 // 単語を含んでいればtrue 106 if (row.key.indexOf(wordUnit) > -1) { 107 matchCnt = matchCnt + 1; 108 } 109 }); 110 if (wordArray.length === matchCnt) { 111 memo.push(row); 112 } 113 } 114 return memo; 115 }, []) || []; 116} 117 118// 単語が一致したセルの回答を「もしかして」を返す 119function findMaybe(word) { 120 return getMayBeData().reduce(function(memo, row) { return memo || (row.key === word && row.value); }, false) || undefined; 121} 122 123// 画像形式でAPI送信 124function sendMessageImage(replyToken, imageUrl) { 125 // replyするメッセージの定義 126 var postData = { 127 "replyToken" : replyToken, 128 "messages" : [ 129 { 130 "type": "image", 131 "originalContentUrl": imageUrl 132 } 133 ] 134 }; 135 return postMessage(postData); 136} 137 138// LINE messaging apiにJSON形式でデータをPOST 139function sendMessage(replyToken, replyText) { 140 // replyするメッセージの定義 141 var postData = { 142 "replyToken" : replyToken, 143 "messages" : [ 144 { 145 "type" : "text", 146 "text" : replyText 147 } 148 ] 149 }; 150 return postMessage(postData); 151} 152 153// LINE messaging apiにJSON形式で確認をPOST 154function sendMayBe(replyToken, mayBeWord) { 155 // replyするメッセージの定義 156 var postData = { 157 "replyToken" : replyToken, 158 "messages" : [ 159 { 160 "type" : "template", 161 "altText" : "もしかして検索キーワードは「" + mayBeWord + "」ですか?", 162 "template": { 163 "type": "confirm", 164 "actions": [ 165 { 166 "type":"postback", 167 "label":"はい", 168 "data":"action=detail", 169 }, 170 { 171 "type": "message", 172 "label": "いいえ", 173 "text": "いいえ、違います。" 174 } 175 ], 176 "text": "答えが見つかりませんでした。もしかして検索キーワードは「" + mayBeWord + "」ですか?" 177 } 178 179 } 180 ] 181 }; 182 return postMessage(postData); 183} 184 185// LINE messaging apiにJSON形式でデータをPOST 186function postMessage(postData) { 187 // リクエストヘッダ 188 var headers = { 189 "Content-Type" : "application/json; charset=UTF-8", 190 "Authorization" : "Bearer " + ACCESS_TOKEN 191 }; 192 // POSTオプション作成 193 var options = { 194 "method" : "POST", 195 "headers" : headers, 196 "payload" : JSON.stringify(postData) 197 }; 198 return UrlFetchApp.fetch(REPLY, options); 199} 200 201/** ユーザーのアカウント名を取得 202 */ 203function getUserDisplayName(userId) { 204 var url = 'https://api.line.me/v2/bot/profile/' + userId; 205 var userProfile = UrlFetchApp.fetch(url,{ 206 'headers': { 207 'Authorization' : 'Bearer ' + ACCESS_TOKEN, 208 }, 209 }) 210 return JSON.parse(userProfile).displayName; 211} 212 213// userIdシートに記載 214function lineUserId(userId) { 215 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('userId'); 216 sheet.appendRow([userId]); 217} 218 219// debugシートに値を記載 220function debug(text, userId) { 221 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 222 var date = new Date(); 223 var userName = getUserDisplayName(userId); 224 sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 225} 226
test
1// debugシートに値を記載 2function debug(text, userId) { 3 var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 4 var date = new Date(); 5 var userName = getUserDisplayName(userId); 6 sheet.appendRow([userId, userName, postMsg, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 7} 8//textの部分をpostMsgに変えました
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/07 01:04
2021/01/07 02:20
2021/01/07 03:34
2021/01/07 04:01 編集
2021/01/07 04:24
2021/01/07 04:33