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