前提・実現したいこと
こちらの記事を参考にチャットボットを作成しようと思っています。
https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca
超初心者です。
発生している問題・エラーメッセージ
既読はつくが、返信が帰ってこない
該当のソースコード
// 利用しているシート var SHEET_ID = '(1nAQIaKcmXlwzZWMw6yCwFiu4Rt-PLzkRw7gztfSf2E0)'; // 利用しているSSのシート名(※変えるとみえなくなる) var SHEET_NAME = 'faq'; // 利用しているもしかしてSSのシート名(※変えるとみえなくなる) var SHEET_NAME_MAYBE = 'maybe'; // LINE Message API アクセストークン var ACCESS_TOKEN = '(UY6wdZ9Khtv/K8R8a6jIH7tO7dBEBP0rMWBkxERAgeenD+80BYZPE1kzDzatw9lNp3X82gziRZGO1Yiedzb5XWyLztNfWNwHqzlEB1Ji658xrmmLd8Fi6LcFEep4E3gXo9kb088PH63VY8C0w683yQdB04t89/1O/w1cDnyilFU=)'; // 通知URL var PUSH = "https://api.line.me/v2/bot/message/push"; // リプライ時URL var REPLY = "https://api.line.me/v2/bot/message/reply"; // プロフィール取得URL var PROFILE = "https://api.line.me/v2/profile"; /** * doPOST * POSTリクエストのハンドリング */ function doPost(e) { var json = JSON.parse(e.postData.contents); reply(json); } /** * doGet * GETリクエストのハンドリング */ function doGet(e) { return ContentService.createTextOutput("SUCCESS"); } /** * reply * ユーザからのアクションに返信する */ function reply(data) { // POST情報から必要データを抽出 var lineUserId = data.events[0].source.userId; var postMsg = data.events[0].message.text; var replyToken = data.events[0].replyToken; var action = data.events[0].message.action; // 記録用に検索語とuserIdを記録 // debug(postMsg, lineUserId); debug(action, lineUserId); // 検索語に対しての回答をSSから取得 var answers = findResponseArray(postMsg); // 回答メッセージを作成 var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。'; // 回答の有無に応じて分岐 if (answers.length === 0) { // 「類似の検索キーワード」がないかチェック var mayBeWord = findMaybe(postMsg); if (typeof mayBeWord === "undefined") { // 回答がない場合の定型文 sendMessage(replyToken, '答えが見つかりませんでした。別のキーワードで質問してみてください。'); } else { sendMayBe(replyToken, mayBeWord); } } else { // 回答がある場合のメッセージ生成 answers.forEach(function(answer) { replyText = replyText + "\n\n=============\n\nQ:" + answer.key + "\n\nA:" + answer.value; }); // 1000文字を超える場合は途中で切る if (replyText.length > 1000) { replyText = replyText.slice(0,1000) + "……\n\n=============\n\n回答文字数オーバーです。詳細に検索キーワードを絞ってください。"; } // メッセージAPI送信 sendMessage(replyToken, replyText); } } // SSからデータを取得 function getData() { var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME); var data = sheet.getDataRange().getValues(); return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); } // SSから「もしかして」データを取得 function getMayBeData() { var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_MAYBE); var data = sheet.getDataRange().getValues(); return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; }); } // 単語が一致したセルの回答を配列で返す function findResponseArray(word) { // スペース検索用のスペースを半角に統一 word = word.replace(' ',' '); // 単語ごとに配列に分割 var wordArray = word.split(' '); return getData().reduce(function(memo, row) { // 値が入っているか if (row.value) { // AND検索ですべての単語を含んでいるか var matchCnt = 0; wordArray.forEach(function(wordUnit) { // 単語を含んでいればtrue if (row.key.indexOf(wordUnit) > -1) { matchCnt = matchCnt + 1; } }); if (wordArray.length === matchCnt) { memo.push(row); } } return memo; }, []) || []; } // 単語が一致したセルの回答を「もしかして」を返す function findMaybe(word) { return getMayBeData().reduce(function(memo, row) { return memo || (row.key === word && row.value); }, false) || undefined; } // 画像形式でAPI送信 function sendMessageImage(replyToken, imageUrl) { // replyするメッセージの定義 var postData = { "replyToken" : replyToken, "messages" : [ { "type": "image", "originalContentUrl": imageUrl } ] }; return postMessage(postData); } // LINE messaging apiにJSON形式でデータをPOST function sendMessage(replyToken, replyText) { // replyするメッセージの定義 var postData = { "replyToken" : replyToken, "messages" : [ { "type" : "text", "text" : replyText } ] }; return postMessage(postData); } // LINE messaging apiにJSON形式で確認をPOST function sendMayBe(replyToken, mayBeWord) { // replyするメッセージの定義 var postData = { "replyToken" : replyToken, "messages" : [ { "type" : "template", "altText" : "もしかして検索キーワードは「" + mayBeWord + "」ですか?", "template": { "type": "confirm", "actions": [ { "type":"postback", "label":"はい", "data":"action=detail", }, { "type": "message", "label": "いいえ", "text": "いいえ、違います。" } ], "text": "答えが見つかりませんでした。もしかして検索キーワードは「" + mayBeWord + "」ですか?" } } ] }; return postMessage(postData); } // LINE messaging apiにJSON形式でデータをPOST function postMessage(postData) { // リクエストヘッダ var headers = { "Content-Type" : "application/json; charset=UTF-8", "Authorization" : "Bearer " + ACCESS_TOKEN }; // POSTオプション作成 var options = { "method" : "POST", "headers" : headers, "payload" : JSON.stringify(postData) }; return UrlFetchApp.fetch(REPLY, options); } /** ユーザーのアカウント名を取得 */ function getUserDisplayName(userId) { var url = 'https://api.line.me/v2/bot/profile/' + userId; var userProfile = UrlFetchApp.fetch(url,{ 'headers': { 'Authorization' : 'Bearer ' + ACCESS_TOKEN, }, }) return JSON.parse(userProfile).displayName; } // userIdシートに記載 function lineUserId(userId) { var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('userId'); sheet.appendRow([userId]); } // debugシートに値を記載 function debug(text, userId) { var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); var date = new Date(); var userName = getUserDisplayName(userId); sheet.appendRow([userId, userName, text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); }
試したこと
・当たり前ですが、スプレッドシートのID入力/TOKEN入力はしています
・新規で作成
・Webhookの利用のON
・匿名含むを選択
補足情報(FW/ツールのバージョンなど)
回答1件
あなたの回答
tips
プレビュー