← ブログ一覧に戻る

LINE WebhookをGASで受け取る時の302エラー問題と解決方法

2025年11月13日

問題の発生

LINE公式アカウントのWebhook機能を使って、Google Apps Script(GAS)で自動応答を作ろうとした時に遭遇した問題です。

LINE Messaging APIのWebhookは、イベントが発生すると指定したURLにPOSTリクエストを送信します。 このURLにGASのウェブアプリURLを設定すると、302 Foundエラーが発生してしまいます。

なぜ302エラーが発生するのか

GASのウェブアプリをデプロイすると、URLは以下のような形式になります:

https://script.google.com/macros/s/SCRIPT_ID/exec

このURLにアクセスすると、実際には以下のようなURLにリダイレクト(302)されます:

https://script.googleusercontent.com/...

問題は、LINE Webhookがリダイレクトをサポートしていないことです。 302レスポンスが返ってきた時点でエラーと判定されてしまいます。

curlでの検証

この問題を切り分けるために、curlコマンドでテストしました:

curl -L \
  -H "Content-Type: application/json" \
  -d '{
    "events": [{
      "type": "message",
      "replyToken": "dummyToken",
      "source": {"userId": "U1234567890abcdef"},
      "message": {"type": "text", "text": "テスト"}
    }]
  }' \
  "https://script.google.com/macros/s/.../exec"

-Lオプションを付けることでリダイレクトを追従できますが、 LINEのWebhookシステム自体がリダイレクトに対応していないため、この方法は使えません。

解決方法

この問題を解決するために、中継サーバーを立てる方法があります。

中継の仕組み

  1. LINEからWebhookを中継サーバーで受け取る
  2. 中継サーバーがすぐに200 OKを返す
  3. 中継サーバーがリダイレクトに対応した方法でGASにリクエストを転送
  4. GASで処理を実行

この中継サーバーの役割を果たすのが、Webhook Proxy Serviceです。

Webhook Proxy Serviceの使い方

1. API Keyを取得

ダッシュボードからGoogleアカウントでログインし、API Keyを取得します。

2. GASのURLを用意

通常通りGASでdoPost関数を作成し、ウェブアプリとしてデプロイします。

3. LINE Webhookに設定

以下の形式でURLを設定:

https://webhook-proxy.com?url=YOUR_GAS_URL&key=YOUR_API_KEY

実際のGASコード例

function doPost(e) {
  try {
    const json = JSON.parse(e.postData.contents);
    const events = json.events || [];
    
    const sheet = SpreadsheetApp
      .getActiveSpreadsheet()
      .getSheetByName("シート1");
    
    events.forEach(event => {
      if (event.type === "message") {
        const userId = event.source.userId;
        const text = event.message.text;
        const timestamp = new Date();
        
        // スプレッドシートに記録
        sheet.appendRow([timestamp, userId, text]);
      }
    });
    
    return ContentService
      .createTextOutput(JSON.stringify({ success: true }))
      .setMimeType(ContentService.MimeType.JSON);
  } catch (error) {
    return ContentService
      .createTextOutput(JSON.stringify({ 
        success: false, 
        error: error.toString() 
      }))
      .setMimeType(ContentService.MimeType.JSON);
  }
}

まとめ

  • GASのURLは302リダイレクトを返すため、LINE Webhookで直接使えない
  • 中継サーバーを挟むことで問題を解決できる
  • Webhook Proxy Serviceを使えば簡単にセットアップ可能
  • 月1000回まで無料で利用できる

今すぐ試してみる

無料でAPI Keyを取得して、すぐに使い始められます。

ダッシュボードへ →