GASでGoogleフォームの内容をDiscord通知すると429エラーになる原因と対策まとめ

JavaScript

Googleフォームの送信内容をGoogle Apps Script(GAS)経由でDiscordへ通知する仕組みは非常に便利ですが、最近になって突然「429 Too Many Requests」エラーが発生するケースが増えています。特に以前は正常に動いていたのに、急にWebhook通知が失敗する場合は、Discord側の仕様変更やWebhook制限が関係している可能性があります。この記事では、GASでDiscord通知時に429エラーが出る原因と、GASだけで完結できる実践的な対策について解説します。

429エラーとは何か

429エラーは「リクエストが多すぎる」という意味のHTTPステータスです。DiscordではWebhookに対して一定時間内に送信できる回数が制限されています。

通常は短時間に大量送信した場合に発生しますが、最近ではリクエスト数が少なくても429が出るケースがあります。

特にGASでは、以下のような条件でDiscord側に怪しいアクセスと判定されることがあります。

  • 同一Webhookへの長期間利用
  • 短時間の連続実行
  • GAS特有のUser-Agent
  • Discord側のスパム判定強化

Webhookを貼り直すと動く理由

Webhook URLを毎回貼り直すと正常動作するのは、Discord側でWebhook単位の制限やフラグ管理が行われている可能性が高いためです。

つまり、Webhook自体が一時的に制限状態になっているものの、新しいWebhookとして認識されることで解除されている状態です。

これはコードの問題というより、Discord側のレート制限や検知仕様の影響であることが多いです。

GASのみでできる429対策

送信前に待機時間を入れる

もっとも簡単で効果がある方法です。

Utilities.sleep(3000);

Discord送信前に3秒程度待機させることで、429を回避できる場合があります。

muteHttpExceptionsを使う

エラー内容を取得できるようにします。

UrlFetchApp.fetch(url, {
  method: "post",
  contentType: "application/json",
  payload: JSON.stringify(data),
  muteHttpExceptions: true
});

これによりDiscord側のレスポンス内容を確認しやすくなります。

retry_afterを利用する

Discordの429レスポンスにはretry_afterが含まれることがあります。

これを利用して自動再送する方法もあります。

if(response.getResponseCode() == 429){
  Utilities.sleep(5000);
}

フォーム送信トリガーの重複も確認する

GASでは知らない間にトリガーが複数登録されているケースがあります。

例えばフォーム送信1回に対して、実際には同じコードが2回以上動いていることがあります。

Apps Scriptの「トリガー」画面から以下を確認してください。

  • 同じ関数が複数登録されていないか
  • 古いプロジェクトのトリガーが残っていないか
  • フォーム側とスプレッドシート側の両方にトリガーがないか

これだけで改善するケースもあります。

Discord側仕様変更の影響も大きい

2024年後半以降、DiscordではWebhookの制限が以前より厳しくなったという報告が増えています。

特に無料環境のBotやWebhookはスパム対策の影響を受けやすく、以前のコードが突然動かなくなるケースがあります。

そのため、古い解説サイトのコードをそのまま利用すると現在の仕様に合わない場合があります。

参考として、GoogleフォームとDiscord通知の基本構成については[参照]のような記事がありますが、現在は429対策を追加する必要があるケースが増えています。

おすすめの安定化構成

対策 効果
Utilities.sleep 短時間連投回避
retry_after対応 自動再送可能
トリガー整理 重複送信防止
Webhook再発行 一時制限解除
ログ出力 原因特定しやすい

まとめ

GASからDiscordへ通知する際の429エラーは、単純な送信回数だけでなく、Discord側のレート制限やWebhook検知仕様が関係していることがあります。

特に「Webhookを貼り直すと動く」という症状は、Webhook単位で制限されている可能性が高いです。

GASだけでも、sleep追加・retry_after対応・トリガー整理などを行うことで改善するケースは多くあります。まずは送信間隔を空ける対策とトリガー確認から試すのがおすすめです。

コメント

タイトルとURLをコピーしました