質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

984閲覧

Linebotの返信結果によって、スプレットシートを色分けしたい

naoko_

総合スコア2

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/07/16 11:45

ユーザーから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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

debug()関数の中で定義されていない変数(answers)が使われています。
質問文に記載の要件とプログラム全体から推測するに、findResponseArray()関数の返値をanswerに設定すればよいと思われます。

diff

1// debugシートに値を記載 2function debug(text, userId) { 3 var sheet1 = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug'); 4 var sheet2 = SpreadsheetApp.openById(SHEET_ID).getSheetByName('toupdate'); 5 var date = new Date(); 6 var userName = getUserDisplayName(userId); 7 sheet1.appendRow([text, Utilities.formatDate( date, 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss')]); 8 sheet2.appendRow([text]); 9 10 var sh2lastrow = sheet2.getLastRow(); // 追加した行の行番号を取得 11 var sh2lastcolumn = sheet2.getLastColumn(); // 一番右端の列番号を取得 12 // 追加した行のrangeを取得。 13 var changeRange = sheet2.getRange(sh2lastrow, 1, 1, sh2lastcolumn); 14 // 背景色を変える。 15- reply(data);  <---これは不要なので削除。 16+ //answers定義追加 17+ var answers = findResponseArray(text); 18 if (answers.length === 0) { 19 // 「類似の検索キーワード」がないかチェック 20- var mayBeWord = findMaybe(postMsg); <---postMsgは定義されていない。ここはtextが正しい。 21+ var mayBeWord = findMaybe(text); 22 if (typeof mayBeWord === "undefined") { 23 // 回答がない場合の定型文 24 changeRange.setBackground("blue"); 25 } else { 26 changeRange.setBackground("red"); 27 } 28 } 29}

投稿2021/07/16 13:06

編集2021/07/16 13:10
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naoko_

2021/07/18 03:48

解決しました!ありがとうございました! 無事、回答できなかった場合のセルの色を青にできました。 しかし回答ができている場合セルがif elseで赤になるですが、背景色に色がつきません(文字は入力されるのですが) これってなんででしょうか。。
退会済みユーザー

退会済みユーザー

2021/07/18 06:01 編集

なぜ回答ができている場合セルに色がつかないか:それは、「質問文に記載されている元々のコードが、そういう処理をするようになっているから」です。   というのは回答になっていないので、下記に詳しく説明します。 まずdebug()関数内では、LINEから投稿されてきた単語を、findResponseArray()関数に通した後 toupdateシートの末尾に一旦記録します。 この時点では、toupdateシートの末尾に記録された単語は、faqシートやmaybeシートに該当するものがあろうがなかろうが、背景色はついていません。 そしてdebug関数の後半 「 if (answers.length === 0) { // 「類似の検索キーワード」がないかチェック ...」 以降の部分で以下のような処理をしています。 ・answers.length === 0 、すなわち、「lineから送られてきた単語が、faqシートのA列のどの単語にも該当しない場合」 →findMaybe関数を使って、maybeシートに該当する単語がないかさらに調べる →→存在する場合は、背景色を赤にする。 →→存在しない場合は、背景色を青にする。 したがって、「回答ができている場合」(すなわち「lineから送られてきた単語がfaqシートの中に存在する場合」)は そもそもanswers.length === 0 にならないので 背景色を付ける処理は実行されません。 toupdateの単語に背景色がつくのは、「faqシートには存在しないがmaybeシートに存在する」または「faqシートにもmaybeシートにも存在しない」場合だけです。 debug関数及びtoupdateシートの目的は、「ユーザーが似たような単語を送ってきたときに補足する役割を果たすmaybeシート」を拡充させることであると思われますので 上記の動作で問題ないと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問