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

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

ただいまの
回答率

87.49%

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

受付中

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 2,573

score 16

前提・実現したいこと

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

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

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

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

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

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

// メッセージに対する応答メソッド
function doPost(e) {
  var json = JSON.parse(e.postData.contents);  

  var reply_token= json.events[0].replyToken;
  if (typeof reply_token === 'undefined') {
    return;
  }

  var user_id = json.events[0].source.userId;
  var user_message = json.events[0].message.text;  
  var user_message2 = json.events[1].message.text;

  var reply_messages;
  var spreadSheet;

  if ('ヘルプ' == user_message) {
    reply_messages = ["ヘルプ"];
  } 
  // 内容一部省略
  else if ('内容をクリア' == user_message) {
    reply_messages = ["本当に削除してよろしいですか?\n\nよろしければ『はい』、キャンセルする場合は『いいえ』と入力してください。"];
      if ('はい' == user_message2){
          doReset(user_id)
      reply_messages = ["削除しました"]
     }else {
      reply_messages = ["キャンセルしました"]
  }

  // 内容一部省略

  var messages = reply_messages.map(function (v) {
    return {'type': 'text', 'text': v};    
  });    
  UrlFetchApp.fetch(line_endpoint, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + CHANNEL_ACCESS_TOKEN,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': reply_token,
      'messages': messages,
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}
// スプレッドシートの内容をクリアするメソッド

function doReset(user_id) {
  var spreadSheet = getSpreadSheet(user_id);
  var sheet = spreadSheet.getSheets()[0];
  sheet.getRange('A2:A4').clear();
}

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

試したこと

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

  function doReset(user_id) {
    var spreadSheet = getSpreadSheet(user_id);
    var sheet = spreadSheet.getSheets()[0];
    var json = JSON.parse(e.postData.contents);  

    var reply_token= json.events[0].replyToken;
    if (typeof reply_token === 'undefined') {
    return;
  }

  var user_id = json.events[0].source.userId;
  var user_message = json.events[0].message.text;  

  var reply_messages;

  if('はい' == user_message){
   sheet.getRange('A2:A4').clear();
  reply_messages = ["削除しました"]
} else{
  reply_messages = ["キャンセルしました"]
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る