teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

コードの修正

2021/01/07 03:30

投稿

nezumimuzen
nezumimuzen

スコア19

title CHANGED
File without changes
body CHANGED
@@ -64,8 +64,177 @@
64
64
  // debug(postMsg, lineUserId);
65
65
  debug(action, lineUserId);
66
66
 
67
- .................
67
+ // 検索語に対しての回答をSSから取得
68
+ var answers = findResponseArray(postMsg);
68
69
 
70
+ // 回答メッセージを作成
71
+ var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。';
72
+ // 回答の有無に応じて分岐
73
+ if (answers.length === 0) {
74
+ // 「類似の検索キーワード」がないかチェック
75
+ var mayBeWord = findMaybe(postMsg);
76
+ if (typeof mayBeWord === "undefined") {
77
+ // 回答がない場合の定型文
78
+ sendMessage(replyToken, '答えが見つかりませんでした。別のキーワードで質問してみてください。');
79
+ } else {
80
+ sendMayBe(replyToken, mayBeWord);
81
+ }
82
+ } else {
83
+ // 回答がある場合のメッセージ生成
84
+ answers.forEach(function(answer) {
85
+ replyText = replyText + "\n\n=============\n\nQ:" + answer.key + "\n\nA:" + answer.value;
86
+ });
87
+
88
+ // 1000文字を超える場合は途中で切る
89
+ if (replyText.length > 1000) {
90
+ replyText = replyText.slice(0,1000) + "……\n\n=============\n\n回答文字数オーバーです。詳細に検索キーワードを絞ってください。";
91
+ }
92
+ // メッセージAPI送信
93
+ sendMessage(replyToken, replyText);
94
+ }
95
+ }
96
+
97
+ // SSからデータを取得
98
+ function getData() {
99
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
100
+ var data = sheet.getDataRange().getValues();
101
+
102
+ return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; });
103
+ }
104
+
105
+ // SSから「もしかして」データを取得
106
+ function getMayBeData() {
107
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_MAYBE);
108
+ var data = sheet.getDataRange().getValues();
109
+ return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; });
110
+ }
111
+
112
+ // 単語が一致したセルの回答を配列で返す
113
+ function findResponseArray(word) {
114
+ // スペース検索用のスペースを半角に統一
115
+ word = word.replace(' ',' ');
116
+ // 単語ごとに配列に分割
117
+ var wordArray = word.split(' ');
118
+ return getData().reduce(function(memo, row) {
119
+ // 値が入っているか
120
+ if (row.value) {
121
+ // AND検索ですべての単語を含んでいるか
122
+ var matchCnt = 0;
123
+ wordArray.forEach(function(wordUnit) {
124
+ // 単語を含んでいればtrue
125
+ if (row.key.indexOf(wordUnit) > -1) {
126
+ matchCnt = matchCnt + 1;
127
+ }
128
+ });
129
+ if (wordArray.length === matchCnt) {
130
+ memo.push(row);
131
+ }
132
+ }
133
+ return memo;
134
+ }, []) || [];
135
+ }
136
+
137
+ // 単語が一致したセルの回答を「もしかして」を返す
138
+ function findMaybe(word) {
139
+ return getMayBeData().reduce(function(memo, row) { return memo || (row.key === word && row.value); }, false) || undefined;
140
+ }
141
+
142
+ // 画像形式でAPI送信
143
+ function sendMessageImage(replyToken, imageUrl) {
144
+ // replyするメッセージの定義
145
+ var postData = {
146
+ "replyToken" : replyToken,
147
+ "messages" : [
148
+ {
149
+ "type": "image",
150
+ "originalContentUrl": imageUrl
151
+ }
152
+ ]
153
+ };
154
+ return postMessage(postData);
155
+ }
156
+
157
+ // LINE messaging apiにJSON形式でデータをPOST
158
+ function sendMessage(replyToken, replyText) {
159
+ // replyするメッセージの定義
160
+ var postData = {
161
+ "replyToken" : replyToken,
162
+ "messages" : [
163
+ {
164
+ "type" : "text",
165
+ "text" : replyText
166
+ }
167
+ ]
168
+ };
169
+ return postMessage(postData);
170
+ }
171
+
172
+ // LINE messaging apiにJSON形式で確認をPOST
173
+ function sendMayBe(replyToken, mayBeWord) {
174
+ // replyするメッセージの定義
175
+ var postData = {
176
+ "replyToken" : replyToken,
177
+ "messages" : [
178
+ {
179
+ "type" : "template",
180
+ "altText" : "もしかして検索キーワードは「" + mayBeWord + "」ですか?",
181
+ "template": {
182
+ "type": "confirm",
183
+ "actions": [
184
+ {
185
+ "type":"postback",
186
+ "label":"はい",
187
+ "data":"action=detail",
188
+ },
189
+ {
190
+ "type": "message",
191
+ "label": "いいえ",
192
+ "text": "いいえ、違います。"
193
+ }
194
+ ],
195
+ "text": "答えが見つかりませんでした。もしかして検索キーワードは「" + mayBeWord + "」ですか?"
196
+ }
197
+
198
+ }
199
+ ]
200
+ };
201
+ return postMessage(postData);
202
+ }
203
+
204
+ // LINE messaging apiにJSON形式でデータをPOST
205
+ function postMessage(postData) {
206
+ // リクエストヘッダ
207
+ var headers = {
208
+ "Content-Type" : "application/json; charset=UTF-8",
209
+ "Authorization" : "Bearer " + ACCESS_TOKEN
210
+ };
211
+ // POSTオプション作成
212
+ var options = {
213
+ "method" : "POST",
214
+ "headers" : headers,
215
+ "payload" : JSON.stringify(postData)
216
+ };
217
+ return UrlFetchApp.fetch(REPLY, options);
218
+ }
219
+
220
+ /** ユーザーのアカウント名を取得
221
+ */
222
+ function getUserDisplayName(userId) {
223
+ var url = 'https://api.line.me/v2/bot/profile/' + userId;
224
+ var userProfile = UrlFetchApp.fetch(url,{
225
+ 'headers': {
226
+ 'Authorization' : 'Bearer ' + ACCESS_TOKEN,
227
+ },
228
+ })
229
+ return JSON.parse(userProfile).displayName;
230
+ }
231
+
232
+ // userIdシートに記載
233
+ function lineUserId(userId) {
234
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('userId');
235
+ sheet.appendRow([userId]);
236
+ }
237
+
69
238
  // debugシートに値を記載
70
239
  function debug(text, userId) {
71
240
  var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('debug');

3

リンクの間違いを修正

2021/01/07 03:30

投稿

nezumimuzen
nezumimuzen

スコア19

title CHANGED
File without changes
body CHANGED
@@ -1,4 +1,4 @@
1
- https://qiita.com/mick_k1218/items/0ceb411f63a298decad2
1
+ https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca
2
2
  上記のサイトを参考にGASでスプレッドシートからLINEの返信を返すbotを作っているのですが、最後debugシートへ値を記載する際、送ったテキストを転記したいと思っております。
3
3
  素人ながらコードを読み、「postMsg」の部分を取り出すものと思い以下(test)のようにコードを変えましたが、LINEbotが返信しなくなり原因がわかりません。
4
4
 

2

タグを追加

2021/01/07 01:05

投稿

nezumimuzen
nezumimuzen

スコア19

title CHANGED
File without changes
body CHANGED
File without changes

1

タイトルの脱字を修正しました

2021/01/06 06:21

投稿

nezumimuzen
nezumimuzen

スコア19

title CHANGED
@@ -1,1 +1,1 @@
1
- LINE botのスプレッドシート
1
+ LINE botのスプレッドシートにテキストが記載されない
body CHANGED
File without changes