2
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 Botを作成!Webhook処理の解説

Posted at

1. doPost関数の役割

この関数は、LINEプラットフォームから送信されたメッセージを受け取り、適切な返信をする処理を行います。

2. 処理の流れ(コード解説)

(1) 受信データの解析

javascript
var json = JSON.parse(e.postData.contents);
Logger.log("受信データ: " + JSON.stringify(json));
  • e.postData.contents にはLINEから送られてきたデータが格納されている
  • そのデータを JSON.parse でオブジェクトに変換
  • 受信したデータを Logger.log() で記録(デバッグ用)

(2) イベントデータのチェック

javascript
var events = json.events;
if (!events || events.length === 0) {
  return ContentService.createTextOutput(JSON.stringify({ "status": "no event" }))
    .setMimeType(ContentService.MimeType.JSON);
}
  • LINEからのイベント(メッセージ)が存在するか確認
  • イベントが空(events.length === 0)の場合は、処理を終了

(3) replyTokenuserIdの取得

javascript
var replyToken = events[0].replyToken;
var userMessage = events[0].message.text.trim();
var userId = events[0].source && events[0].source.userId ? events[0].source.userId : null;
  • replyToken: LINE Botが返信するときに必要なトークン(この値を使って返信を送る)
  • userMessage: ユーザーが送信したメッセージ(前後の空白を削除)
  • userId: ユーザーのLINE ID(存在しない場合はnull)

(4) userIdのチェック(エラー処理)

javascript
if (!userId) {
  Logger.log("エラー: userIdが取得できませんでした。");
  sendLineReply(replyToken, "エラー: ユーザーIDが取得できませんでした。");
  return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": "userId not found" }))
    .setMimeType(ContentService.MimeType.JSON);
}
  • userIdが取得できない場合(例えば、LINE公式アカウントのシステムメッセージなど)
    • Logger.log()でエラーログを記録
    • ユーザーにエラーメッセージを返信
    • returnで処理を終了

(5) 返信メッセージの決定

javascript
var replyMessage = "すみません、理解できませんでした。";
if (userMessage.includes("こんにちは")) {
  replyMessage = "こんにちは!";
} else if (userMessage.includes("天気")) {
  replyMessage = "今日の天気は晴れです!";
}

*userMessageの内容によって返信を変える
* 「こんにちは」を含む → 「こんにちは!」と返信
* 「天気」を含む 「今日の天気は晴れです!」と返信
* どちらでもない場合は 「すみません、理解できませんでした。」と返信

(6) LINEへ返信を送信

javascript
Logger.log("返信メッセージ: " + replyMessage);
sendLineReply(replyToken, replyMessage);
  • Logger.log()で送信するメッセージを記録(デバッグ用)
  • sendLineReply()関数を呼び出し、LINEに返信を送る

(7) 正常終了レスポンスの返却

javascript
return ContentService.createTextOutput(JSON.stringify({ "status": "success" }))
  .setMimeType(ContentService.MimeType.JSON);
  • ContentService.createTextOutput() を使ってLINEにレスポンスを返す
  • {"status": "success"} というJSONデータを返す

(8) エラー処理

javascript
catch (error) {
  Logger.log("エラー: " + error.toString());
  return ContentService.createTextOutput(JSON.stringify({ "status": "error", "message": error.toString() }))
    .setMimeType(ContentService.MimeType.JSON);
}
  • 何らかのエラーが発生した場合にキャッチ
  • Logger.log() でエラーメッセージを記録
  • JSON形式でエラー情報を返す

3. doPost のまとめ

処理内容 説明
受信データ解析 LINE からのメッセージをJSON形式に変換
イベントデータのチェック イベントが存在するか確認
replyTokenuserId取得 LINEメッセージの識別情報を取得
userIdエラーチェック userId がない場合はエラーレスポンスを返す
返信メッセージを決定 ユーザーのメッセージ内容によって返信内容を選択
返信を送信 sendLineReply() を使って返信を送信
正常終了のレスポンス { "status": "success" }を返す
例外処理 エラーが発生した場合は { "status": "error" } を返す

4. sendLineReply() 関数の解説(補助関数)

この関数は、LINE APIを使ってメッセージを返信する役割を持ちます。

javascript
function sendLineReply(replyToken, message) {
  var channelAccessToken = "YOUR_CHANNEL_ACCESS_TOKEN";

  var url = "https://api.line.me/v2/bot/message/reply";
  var payload = {
    "replyToken": replyToken,
    "messages": [{ "type": "text", "text": message }]
  };

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

  try {
    var response = UrlFetchApp.fetch(url, options);
    Logger.log("LINE返信レスポンス: " + response.getContentText());
  } catch (error) {
    Logger.log("LINE API送信エラー: " + error.toString());
  }
}

役割

  • LINE API (https://api.line.me/v2/bot/message/reply) に replyToken を使ってメッセージを送信
  • vAuthorization ヘッダーに Bearer YOUR_CHANNEL_ACCESS_TOKEN を設定
  • payload にメッセージをJSON形式で送る
  • UrlFetchApp.fetch() を使ってリクエストを送信
  • レスポンスを Logger.log() で記録
  • エラーが発生した場合は Logger.log() でエラーメッセージを記録

5. まとめ

このdoPost関数は、LINEからのメッセージを受け取り、内容に応じた返信を行う基本的なWebhook処理です。
この仕組みを拡張して、スプレッドシート連携やAPI連携を追加することで、さらに高度なLINE Botを作ることができます! 🚀

2
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
2
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?