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?

GASでLINE Botの応答を改善する(エラー処理&リッチメニュー)

Posted at

GASでLINE Botの応答を改善する(エラー処理&リッチメニュー)

前回の記事「Googleスプレッドシートの予定をLINE Botで取得する」では、スプレッドシートと連携してLINE Botがスケジュールを取得できるようにしました。
今回は、エラー処理の強化リッチメニューの設定を行い、より実用的なLINE Botに改善していきます。


1. エラー処理の改善

現在のBotは、エラーが発生した場合、Logger.log に記録するだけですが、ユーザーに適切なエラーメッセージを返すことで、より親切なBotにできます。

エラー処理のポイント

  • ユーザーに適切なエラーメッセージを返す
  • スプレッドシートが見つからない場合の対処
  • LINE APIエラーのハンドリング
  • 予期しないエラーの対応

改善後の doPost 関数

function doPost(e) {
  try {
    var json = JSON.parse(e.postData.contents);
    Logger.log("受信データ: " + JSON.stringify(json));

    var events = json.events;
    if (!events || events.length === 0) {
      return createResponse("イベントがありません");
    }

    var event = events[0];
    var replyToken = event.replyToken;
    var userMessage = event.message.text.trim();
    var userId = event.source && event.source.userId ? event.source.userId : null;

    if (!userId) {
      return sendErrorResponse(replyToken, "ユーザーIDが取得できませんでした。");
    }

    var replyMessage = handleUserMessage(userMessage);
    sendLineReply(replyToken, replyMessage);
    
    return createResponse("success");

  } catch (error) {
    Logger.log("エラー: " + error.toString());
    return createResponse("error", error.toString());
  }
}

function createResponse(status, message = "") {
  return ContentService.createTextOutput(JSON.stringify({ "status": status, "message": message }))
    .setMimeType(ContentService.MimeType.JSON);
}

function sendErrorResponse(replyToken, errorMessage) {
  Logger.log("エラー: " + errorMessage);
  sendLineReply(replyToken, "⚠️ エラーが発生しました: " + errorMessage);
  return createResponse("error", errorMessage);
}

2. リッチメニューを設定する

LINEのリッチメニューを設定することで、ユーザーが直感的に操作できるようになります。
例えば、以下のようなメニューを作成できます。

リッチメニューの構成

ボタン 機能
📅 予定確認 予定を確認
🆕 最新情報 最新ニュース表示
📖 ヘルプ 使い方の説明

リッチメニューの作成手順

1.リッチメニュー画像を用意(サイズ:2500px × 1686px)
2.LINE Developers コンソールでリッチメニューを作成
3.GASでリッチメニューを登録

GASでリッチメニューを設定

function setRichMenu() {
  var channelAccessToken = "YOUR_CHANNEL_ACCESS_TOKEN";
  var url = "https://api.line.me/v2/bot/richmenu";

  var payload = {
    "size": { "width": 2500, "height": 1686 },
    "selected": true,
    "name": "MainMenu",
    "chatBarText": "メニューを開く",
    "areas": [
      {
        "bounds": { "x": 0, "y": 0, "width": 1250, "height": 843 },
        "action": { "type": "message", "text": "予定確認" }
      },
      {
        "bounds": { "x": 1250, "y": 0, "width": 1250, "height": 843 },
        "action": { "type": "message", "text": "最新情報" }
      },
      {
        "bounds": { "x": 0, "y": 843, "width": 2500, "height": 843 },
        "action": { "type": "message", "text": "ヘルプ" }
      }
    ]
  };

  var options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + channelAccessToken
    },
    "payload": JSON.stringify(payload)
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

3. メニュー画像をアップロード

リッチメニューを作成した後、画像をアップロードして適用します。

GASでリッチメニュー画像をアップロード

function uploadRichMenuImage(richMenuId) {
  var channelAccessToken = "YOUR_CHANNEL_ACCESS_TOKEN";
  var imageUrl = "YOUR_IMAGE_URL";

  var url = "https://api.line.me/v2/bot/richmenu/" + richMenuId + "/content";
  var image = UrlFetchApp.fetch(imageUrl).getBlob();
  var options = {
    "method": "post",
    "headers": {
      "Authorization": "Bearer " + channelAccessToken,
      "Content-Type": "image/jpeg"
    },
    "payload": image
  };

  var response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

4. 動作確認

リッチメニューを適用し、Botに「メニュー」と送信して確認してみましょう。

function handleUserMessage(message) {
  if (message === "メニュー") {
    return "📌 メニューの使い方\n\n📅 予定確認 → 今日の予定を表示\n🆕 最新情報 → 最新ニュースを取得\n📖 ヘルプ → 使い方を表示";
  } else if (message === "予定確認") {
    var today = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "yyyy/MM/dd");
    return getSchedule(today);
  } else if (message === "最新情報") {
    return "📢 最新情報はこちら: https://your-news-url.com";
  } else if (message === "ヘルプ") {
    return "🔹 LINE Botの使い方 🔹\n\n1. 日付を入力 → 予定確認\n2. 「メニュー」と送信 → メニュー表示";
  } else {
    return "🤖 すみません、理解できませんでした。メニューから選んでください!";
  }
}

5. まとめ

今回の記事では、エラー処理の強化とリッチメニューの設定を行いました。
これにより、LINE Botがより使いやすくなり、直感的な操作が可能になります。

✅ エラー処理の強化 → ユーザーに適切なエラーメッセージを返す
✅ リッチメニューの作成 → 予定確認や最新情報の取得が簡単に
✅ Botの応答改善 → ユーザーが使いやすい設計に


次の記事

👉 「GASでLINE Botにプッシュ通知を実装する」

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?