1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Google Apps ScriptでLINEボットを作成中、postbackがエラーになるときの対処法

Posted at

LINEbotを作成中、初めてpostbackのデータを処理しようとした。
まず、イベントタイプがmessageかどうかを確かめなければならないところをその処理を行ったため、postbackにメッセージの情報がmessageと同じ形式では取得できないことを知らなかったため、エラーを吐き続けていたようだ。

function doPost(e) {
  const json = JSON.parse(e.postData.contents);
  
  // 受信メッセージのテキストを取得
  const event = json.events[0];
  const userMessage = event.message.text;
  const userId = event.source.userId;

  if (checkQuizStatus(userId) === 0){
    // メッセージに応じた関数を呼び出す
    if (userMessage === 'スポット') {
      //sendSpotRecommendation(event);
      replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。")
    } else if (userMessage === 'スケジュール') {
      //sendSchedule(event);
      replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。")
    } else if (userMessage === 'クイズ') {
      startQuiz(event, userId);
    } else if (userMessage === '天気') {
      //sendWeather(event);
      replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。")
    } else {
      sendDefaultMessage(event);
    }
  }else {
    if (event.type === 'postback') {
      if (event.postback.data === 'continueQuiz') {
        sendNextQuizQuestion(userId);
      } else if (event.postback.data === 'endQuiz') {
        endQuiz(userId);
      } else {
        handleQuizAnswer(event, SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('quiz'));
      }
  }
  var error_message = [{
        type: 'text',
        text: `エラーが発生しました。管理者にお問い合わせください`}]
    pushMessageToUser(userId, error_message)
}}

このスクリプトの最初の方にある以下のスクリプトが問題であった。

  const userMessage = event.message.text;

これはイベントタイプがpostbackではエラーの原因になってしまうのだ。
なので、まずはじめにイベントタイプでの識別をするようにスクリプトを入れ替えてやる必要がある。

変更を加えた。スクリプトが以下のものである。

function doPost(e) {
  const json = JSON.parse(e.postData.contents);
  const event = json.events[0];
  const userId = event.source.userId;

  // postbackイベントの処理
  if (event.type === 'postback') {
    if (checkQuizStatus(userId) !== 0) {
      if (event.postback.data === 'continueQuiz') {
        sendNextQuizQuestion(userId);
      } else if (event.postback.data === 'endQuiz') {
        endQuiz(userId);
      } else {
        handleQuizAnswer(event, SpreadsheetApp.openById(SPREADSHEET_ID).getSheetByName('quiz'));
      }
    } else {
        var check_message = [{
          type: 'text',
          text: "handleQuizAnswer。お近くのソメヤくんまでお知らせください。"
        }];
        pushMessageToUser(userId, check_message);
      pushMessageToUser(userId, error_message);
    }
    return; // postbackイベントの処理を終了
  }

  // メッセージイベントの処理
  if (event.type === 'message' && event.message.type === 'text') {
    const userMessage = event.message.text;

    if (checkQuizStatus(userId) === 0) {
      if (userMessage === 'スポット') {
        replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。");
      } else if (userMessage === 'スケジュール') {
        replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。");
      } else if (userMessage === 'クイズ') {
        startQuiz(event, userId);
      } else if (userMessage === '天気') {
        replyToUser(event.replyToken, "只今実装に向けて鋭意努力しております。\nもう少しお待ち下さい。");
      } else {
        sendDefaultMessage(event);
      }
    } else {
      var error_message = [{
        type: 'text',
        text: `エラーが発生しました。管理者にお問い合わせください。`
      }];
      pushMessageToUser(userId, error_message);
    }
  }
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?