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

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

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

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

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

2回答

6537閲覧

【GAS】LINE Bot(Messaging API)を用いた会話の条件分岐が分かりません。

hanabi.

総合スコア16

LINE Messaging API

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

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

1クリップ

投稿2020/03/10 12:14

前提・実現したいこと

LINE Botにて以下の流れを実装したい。

  • ユーザーが『内容をクリア』と入力
  • 『本当にクリアしますか?はい、またはいいえで答えてください』と返信
  • ユーザーが『はい』と答えた場合、削除する
  • ユーザーが『いいえ』と答えた場合、何もしない

発生している問題・エラーメッセージ

お世話になります。
勉強がてらGAS(スプレッドシート)とLINE Messaging APIを触り始めた初学者です。

現在、LINE上で『内容をクリア』と送ると、スプレッドシート上の指定範囲の内容がクリアされるようにしています。
ただ、これでは誤ってクリアしてしまう可能性があるため、『内容をクリア』の後に『本当にクリアしますか?はいまたはいいえで答えてください』という確認を挟みたいと考えています。

そこで以下のように書いてみたのですが、『本当にクリアしますか?』というメッセージすら届かなくなってしまいました。

Gas

1 2// メッセージに対する応答メソッド 3function doPost(e) { 4 var json = JSON.parse(e.postData.contents); 5 6 var reply_token= json.events[0].replyToken; 7 if (typeof reply_token === 'undefined') { 8 return; 9 } 10 11 var user_id = json.events[0].source.userId; 12 var user_message = json.events[0].message.text; 13 var user_message2 = json.events[1].message.text; 14 15 var reply_messages; 16 var spreadSheet; 17 18 if ('ヘルプ' == user_message) { 19 reply_messages = ["ヘルプ"]; 20 } 21  // 内容一部省略 22 else if ('内容をクリア' == user_message) { 23 reply_messages = ["本当に削除してよろしいですか?\n\nよろしければ『はい』、キャンセルする場合は『いいえ』と入力してください。"]; 24   if ('はい' == user_message2){ 25 doReset(user_id) 26      reply_messages = ["削除しました"] 27     }else { 28      reply_messages = ["キャンセルしました"] 29 } 30 31  // 内容一部省略 32 33 var messages = reply_messages.map(function (v) { 34 return {'type': 'text', 'text': v}; 35 }); 36 UrlFetchApp.fetch(line_endpoint, { 37 'headers': { 38 'Content-Type': 'application/json; charset=UTF-8', 39 'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN, 40 }, 41 'method': 'post', 42 'payload': JSON.stringify({ 43 'replyToken': reply_token, 44 'messages': messages, 45 }), 46 }); 47 return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON); 48}

gas

1// スプレッドシートの内容をクリアするメソッド 2 3function doReset(user_id) { 4 var spreadSheet = getSpreadSheet(user_id); 5 var sheet = spreadSheet.getSheets()[0]; 6 sheet.getRange('A2:A4').clear(); 7}

『はい』『いいえ』と分岐させない場合は想定通り動きました。

試したこと

doResetメソッド内で『はい』『いいえ』で条件分岐すればよいのではと考え、以下のように書きましたが、うまくいきませんでした。

gas

1 function doReset(user_id) { 2 var spreadSheet = getSpreadSheet(user_id); 3 var sheet = spreadSheet.getSheets()[0]; 4 var json = JSON.parse(e.postData.contents); 5 6 var reply_token= json.events[0].replyToken; 7 if (typeof reply_token === 'undefined') { 8 return; 9 } 10 11 var user_id = json.events[0].source.userId; 12 var user_message = json.events[0].message.text; 13 14 var reply_messages; 15 16 if('はい' == user_message){ 17  sheet.getRange('A2:A4').clear(); 18  reply_messages = ["削除しました"] 19} else{ 20  reply_messages = ["キャンセルしました"] 21} 22

初学者ゆえ質問内容に不明瞭な点が多々あるかと思います。ご指摘いただけますと幸いです。
どうか皆様のお知恵をお貸しいただければと思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

「はい/いいえ」のように決まった選択肢から回答を選ぶだけなら、クイックリプライボタンテンプレート を利用する方法もあります。
それぞれのアクションを ポストバックアクション として設定すれば、「はい/いいえ」リンクのタップ時に ポストバックイベント がボットサーバーへ通知されます。

ボタンテンプレートは サンプル画面を解説されている記事 がありますので、参考にどうぞ。

投稿2020/03/13 03:08

draq

総合スコア2573

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

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

0

これまでできていたのに、何のメッセージも送られなくなった、という説明を信じております。

var user_message2 = json.events[1].message.text;

ユーザから送信されたメッセージが複数個あることを確認していますか。おそらく 1 つしかないと思うのですが。
確か仕様では最大5つまとまって送られてくるのだったと思いますが、それはbotが回答する前に、しかもそれなりに高速に連続でメッセージを送ってきたときの話で、キャッチボールするときは events[0]にしかメッセージは入らないと思います。

キャッチボールを成立させるには、例えばスプレッドシートやドキュメントを記録先として利用し、ユーザ id ごとに直前のメッセージを記録しておき、events[0] で「はい」が送られてきたときに、記録しておいたそのユーザのメッセージ履歴を見て直前が、内容クリア、だったら消すという時間を遡るような処理を組む必要があると想像します(やったことないです)

投稿2020/03/12 15:58

papinianus

総合スコア12705

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問