GoogleフォームからDiscord通知でエラー429が頻発する原因とGASでの対策

JavaScript

GoogleフォームからDiscordに通知を送るGAS(Google Apps Script)で、エラー429が頻発するケースが増えています。昨年は問題なかったのに今年になって頻発する場合、Discord側のレート制限やGASのリクエスト仕様変更が原因であることが多いです。この記事では、原因とGAS内で完結できる対策方法を解説します。

エラー429の意味

HTTPステータスコード429は「Too Many Requests」を意味し、短期間に大量のリクエストを送信した場合にDiscordが返すエラーです。エラー429が毎回発生する場合は、フォーム送信ごとのWebhookリクエストがレート制限に引っかかっています。

Webhookを貼り直すと一時的に解決する理由

Webhook URLを再設定すると、Discord側では新しいリクエストとして認識されるため一時的に通知が送信されます。しかし、根本的な原因はリクエストが短期間に集中することにありますので、再設定を繰り返すだけでは恒久的な解決にはなりません。

GASでできるレート制限対策

1. リクエスト間隔を開ける: Utilities.sleep()を使い、Webhook送信の間隔を数百ミリ秒以上空けることで制限回避が可能です。

2. バッチ処理にする: フォーム送信内容を一時的にスプレッドシートやプロパティサービスに保存し、一定時間ごとにまとめてDiscordに送信する方式に変更します。

3. エラー処理の追加: UrlFetchApp.fetch()で429が返ってきた場合に再試行するリトライ処理を実装することで、一時的な制限にも対応可能です。

コード例(リトライと間隔処理)

function sendDiscordWebhook(payload) {
  var url = 'YOUR_DISCORD_WEBHOOK_URL';
  var options = {
    'method': 'post',
    'contentType': 'application/json',
    'payload': JSON.stringify(payload)
  };
  var retries = 3;
  for (var i = 0; i < retries; i++) {
    try {
      var response = UrlFetchApp.fetch(url, options);
      if (response.getResponseCode() == 429) {
        Utilities.sleep(1000); // 1秒待ってリトライ
        continue;
      }
      break;
    } catch(e) {
      Utilities.sleep(1000);
    }
  }
}

まとめ

DiscordのWebhook通知でGASがエラー429になる場合、レート制限が原因です。Webhookを貼り直す方法は一時的な回避策に過ぎません。GAS内で解決するには、送信間隔の調整、バッチ処理、リトライ機能を組み合わせることが推奨されます。Cloudflare等の外部サービスに依存せず、GASだけで完結させることが可能です。

コメント

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