Googleフォームの回答をDiscordに通知する

GAS(Google App Script)を使ってGoogleフォームの回答をDiscordに通知する

手順

DiscordでWebhook URLを作成

  • Discord → 通知したいチャンネル → 歯車「チャンネルを編集」 → 「連携サービス」→「Webhook」→「新しいWebhook」→「Webhook URL」をコピー

Apps Script を作成

  1. フォーム回答先のスプレッドシートを開く
    • フォーム編集画面 → 返信タブ → スプレッドシートアイコンで回答先を開く
  2. スプレッドシートのメニュー「拡張機能」→「Apps Script」
  3. 以下のコードを貼る。WEBHOOK_URLは作成したものに置き換える
/**
 * 初回に一度だけ実行して、DiscordのWebhook URLを保存します。
 * 実行後はこの関数は不要です。下で onFormSubmit が自動で動きます。
 */
function setupWebhook() {
  const WEBHOOK_URL = 'https://discord.com/api/webhooks/xxxx/xxxx'; // ←Discordで発行したURLに差し替え
  PropertiesService.getScriptProperties().setProperty('DISCORD_WEBHOOK_URL', WEBHOOK_URL);
  Logger.log('Saved: ' + WEBHOOK_URL);
}

/**
 * フォーム送信時に自動実行される(インストール型トリガーを設定)
 * e.namedValues: { 質問項目: [回答文字列], ... }
 */
function onFormSubmit(e) {
  try {
    const named = e && e.namedValues ? e.namedValues : {};
    const timestamp = new Date();

    // 送信メッセージ(シンプル版)
    const lines = [];
    lines.push('**📨 新しいフォーム回答**');
    lines.push('日時: ' + Utilities.formatDate(timestamp, Session.getScriptTimeZone(), 'yyyy/MM/dd HH:mm:ss'));
    lines.push(''); // 空行
    Object.keys(named).forEach((key) => {
      const value = Array.isArray(named[key]) ? named[key].join(', ') : named[key];
      lines.push(`• **${key}**: ${value}`);
    });

    const content = lines.join('\n');
    postToDiscord({
      content: content.slice(0, 1900), // 文字数保護(Discordは1メッセージ~2000文字目安)
      username: 'Google Forms Bot',
    });

  } catch (err) {
    console.error(err);
  }
}

/**
 * Discord WebhookへPOST
 */
function postToDiscord(payload) {
  const url = PropertiesService.getScriptProperties().getProperty('DISCORD_WEBHOOK_URL');
  if (!url) throw new Error('DISCORD_WEBHOOK_URL is not set. Run setupWebhook() first.');

  const options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
    muteHttpExceptions: true,
  };
  const res = UrlFetchApp.fetch(url, options);
  const code = res.getResponseCode();
  if (code < 200 || code >= 300) {
    throw new Error('Discord webhook error: ' + code + ' ' + res.getContentText());
  }
}

トリガーを設定

  1. setupWebhookを実行してWebhook URL をスクリプトプロパティに保存する
  2. トリガーを追加
    • Apps Script 画面左「トリガー」→「トリガーを追加」
    • 実行する関数:onFormSubmit
    • イベントのソース:フォーム送信時(または「スプレッドシートから」→「フォーム送信時」)
    • 保存(初回は承認が必要)。承認に失敗したらもう一度保存ボタンを押すとうまくいく。
    • Failure notification settingsは「Notify me immediately」がおすすめ

終わりに

ChatGPTに聞けばやり方を教えてくれるのでわからない箇所があれば聞きながらやると良い。

メールよりDiscordの方が通知したい範囲を選べたりするので便利なこともある。

コメント

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