質問編集履歴

4

コードの修正

2021/01/07 03:30

投稿

nezumimuzen
nezumimuzen

スコア19

test CHANGED
File without changes
test CHANGED
@@ -130,7 +130,345 @@
130
130
 
131
131
 
132
132
 
133
+ // 検索語に対しての回答をSSから取得
134
+
135
+ var answers = findResponseArray(postMsg);
136
+
137
+
138
+
139
+ // 回答メッセージを作成
140
+
141
+ var replyText = '「' + postMsg + '」ですね。かしこまりました。以下、回答です。';
142
+
143
+ // 回答の有無に応じて分岐
144
+
145
+ if (answers.length === 0) {
146
+
147
+ // 「類似の検索キーワード」がないかチェック
148
+
149
+ var mayBeWord = findMaybe(postMsg);
150
+
151
+ if (typeof mayBeWord === "undefined") {
152
+
153
+ // 回答がない場合の定型文
154
+
155
+ sendMessage(replyToken, '答えが見つかりませんでした。別のキーワードで質問してみてください。');
156
+
157
+ } else {
158
+
159
+ sendMayBe(replyToken, mayBeWord);
160
+
161
+ }
162
+
163
+ } else {
164
+
165
+ // 回答がある場合のメッセージ生成
166
+
167
+ answers.forEach(function(answer) {
168
+
169
+ replyText = replyText + "\n\n=============\n\nQ:" + answer.key + "\n\nA:" + answer.value;
170
+
171
+ });
172
+
173
+
174
+
175
+ // 1000文字を超える場合は途中で切る
176
+
177
+ if (replyText.length > 1000) {
178
+
179
+ replyText = replyText.slice(0,1000) + "……\n\n=============\n\n回答文字数オーバーです。詳細に検索キーワードを絞ってください。";
180
+
181
+ }
182
+
183
+ // メッセージAPI送信
184
+
185
+ sendMessage(replyToken, replyText);
186
+
187
+ }
188
+
189
+ }
190
+
191
+
192
+
193
+ // SSからデータを取得
194
+
195
+ function getData() {
196
+
197
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME);
198
+
199
+ var data = sheet.getDataRange().getValues();
200
+
201
+
202
+
203
+ return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; });
204
+
205
+ }
206
+
207
+
208
+
209
+ // SSから「もしかして」データを取得
210
+
211
+ function getMayBeData() {
212
+
213
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName(SHEET_NAME_MAYBE);
214
+
215
+ var data = sheet.getDataRange().getValues();
216
+
217
+ return data.map(function(row) { return {key: row[0], value: row[1], type: row[2]}; });
218
+
219
+ }
220
+
221
+
222
+
223
+ // 単語が一致したセルの回答を配列で返す
224
+
225
+ function findResponseArray(word) {
226
+
227
+ // スペース検索用のスペースを半角に統一
228
+
229
+ word = word.replace(' ',' ');
230
+
231
+ // 単語ごとに配列に分割
232
+
233
+ var wordArray = word.split(' ');
234
+
235
+ return getData().reduce(function(memo, row) {
236
+
237
+ // 値が入っているか
238
+
133
- .................
239
+ if (row.value) {
240
+
241
+ // AND検索ですべての単語を含んでいるか
242
+
243
+ var matchCnt = 0;
244
+
245
+ wordArray.forEach(function(wordUnit) {
246
+
247
+ // 単語を含んでいればtrue
248
+
249
+ if (row.key.indexOf(wordUnit) > -1) {
250
+
251
+ matchCnt = matchCnt + 1;
252
+
253
+ }
254
+
255
+ });
256
+
257
+ if (wordArray.length === matchCnt) {
258
+
259
+ memo.push(row);
260
+
261
+ }
262
+
263
+ }
264
+
265
+ return memo;
266
+
267
+ }, []) || [];
268
+
269
+ }
270
+
271
+
272
+
273
+ // 単語が一致したセルの回答を「もしかして」を返す
274
+
275
+ function findMaybe(word) {
276
+
277
+ return getMayBeData().reduce(function(memo, row) { return memo || (row.key === word && row.value); }, false) || undefined;
278
+
279
+ }
280
+
281
+
282
+
283
+ // 画像形式でAPI送信
284
+
285
+ function sendMessageImage(replyToken, imageUrl) {
286
+
287
+ // replyするメッセージの定義
288
+
289
+ var postData = {
290
+
291
+ "replyToken" : replyToken,
292
+
293
+ "messages" : [
294
+
295
+ {
296
+
297
+ "type": "image",
298
+
299
+ "originalContentUrl": imageUrl
300
+
301
+ }
302
+
303
+ ]
304
+
305
+ };
306
+
307
+ return postMessage(postData);
308
+
309
+ }
310
+
311
+
312
+
313
+ // LINE messaging apiにJSON形式でデータをPOST
314
+
315
+ function sendMessage(replyToken, replyText) {
316
+
317
+ // replyするメッセージの定義
318
+
319
+ var postData = {
320
+
321
+ "replyToken" : replyToken,
322
+
323
+ "messages" : [
324
+
325
+ {
326
+
327
+ "type" : "text",
328
+
329
+ "text" : replyText
330
+
331
+ }
332
+
333
+ ]
334
+
335
+ };
336
+
337
+ return postMessage(postData);
338
+
339
+ }
340
+
341
+
342
+
343
+ // LINE messaging apiにJSON形式で確認をPOST
344
+
345
+ function sendMayBe(replyToken, mayBeWord) {
346
+
347
+ // replyするメッセージの定義
348
+
349
+ var postData = {
350
+
351
+ "replyToken" : replyToken,
352
+
353
+ "messages" : [
354
+
355
+ {
356
+
357
+ "type" : "template",
358
+
359
+ "altText" : "もしかして検索キーワードは「" + mayBeWord + "」ですか?",
360
+
361
+ "template": {
362
+
363
+ "type": "confirm",
364
+
365
+ "actions": [
366
+
367
+ {
368
+
369
+ "type":"postback",
370
+
371
+ "label":"はい",
372
+
373
+ "data":"action=detail",
374
+
375
+ },
376
+
377
+ {
378
+
379
+ "type": "message",
380
+
381
+ "label": "いいえ",
382
+
383
+ "text": "いいえ、違います。"
384
+
385
+ }
386
+
387
+ ],
388
+
389
+ "text": "答えが見つかりませんでした。もしかして検索キーワードは「" + mayBeWord + "」ですか?"
390
+
391
+ }
392
+
393
+
394
+
395
+ }
396
+
397
+ ]
398
+
399
+ };
400
+
401
+ return postMessage(postData);
402
+
403
+ }
404
+
405
+
406
+
407
+ // LINE messaging apiにJSON形式でデータをPOST
408
+
409
+ function postMessage(postData) {
410
+
411
+ // リクエストヘッダ
412
+
413
+ var headers = {
414
+
415
+ "Content-Type" : "application/json; charset=UTF-8",
416
+
417
+ "Authorization" : "Bearer " + ACCESS_TOKEN
418
+
419
+ };
420
+
421
+ // POSTオプション作成
422
+
423
+ var options = {
424
+
425
+ "method" : "POST",
426
+
427
+ "headers" : headers,
428
+
429
+ "payload" : JSON.stringify(postData)
430
+
431
+ };
432
+
433
+ return UrlFetchApp.fetch(REPLY, options);
434
+
435
+ }
436
+
437
+
438
+
439
+ /** ユーザーのアカウント名を取得
440
+
441
+ */
442
+
443
+ function getUserDisplayName(userId) {
444
+
445
+ var url = 'https://api.line.me/v2/bot/profile/' + userId;
446
+
447
+ var userProfile = UrlFetchApp.fetch(url,{
448
+
449
+ 'headers': {
450
+
451
+ 'Authorization' : 'Bearer ' + ACCESS_TOKEN,
452
+
453
+ },
454
+
455
+ })
456
+
457
+ return JSON.parse(userProfile).displayName;
458
+
459
+ }
460
+
461
+
462
+
463
+ // userIdシートに記載
464
+
465
+ function lineUserId(userId) {
466
+
467
+ var sheet = SpreadsheetApp.openById(SHEET_ID).getSheetByName('userId');
468
+
469
+ sheet.appendRow([userId]);
470
+
471
+ }
134
472
 
135
473
 
136
474
 

3

リンクの間違いを修正

2021/01/07 03:30

投稿

nezumimuzen
nezumimuzen

スコア19

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- https://qiita.com/mick_k1218/items/0ceb411f63a298decad2
1
+ https://qiita.com/WdknWdkn/items/b78ae572e7cb5c9dfdca
2
2
 
3
3
  上記のサイトを参考にGASでスプレッドシートからLINEの返信を返すbotを作っているのですが、最後debugシートへ値を記載する際、送ったテキストを転記したいと思っております。
4
4
 

2

タグを追加

2021/01/07 01:05

投稿

nezumimuzen
nezumimuzen

スコア19

test CHANGED
File without changes
test CHANGED
File without changes

1

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

2021/01/06 06:21

投稿

nezumimuzen
nezumimuzen

スコア19

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