Featured image of post Googleフォームの回答をDiscordに通知する(サイレントメッセージ)

Googleフォームの回答をDiscordに通知する(サイレントメッセージ)

GASを用いてGoogleフォームの回答をDiscordに通知する方法を説明します

概要

以下の要件を満たす必要がありました

  • Googleフォームの回答が来た時に通知が欲しい
    • 設問と回答も見たい
  • メールなどだと他の者に埋もれてしまうのでチャンネル別で管理できるDiscordに通知したい
  • メンションをかけて特定の相手・ロールは通知が付くようにしたい
  • 深夜などの嫌な時間帯に通知が来るのを避けるためにサイレントメッセージを使用したい

コード

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function onFormSubmit(e) {
  const responses = e.response.getItemResponses();
  const webhookUrl = 'https://discord.com/api/webhooks/...';
  const userID = 'hogehoge';
  const roleID = 'hogehoge';

  let fields = [];

  responses.forEach(response => {
    fields.push({
      name: response.getItem().getTitle(),
      value: response.getResponse(),
      inline: false
    });
  });


  let mentions = '';
  if (userID && userID !== 'hogehoge') {
    mentions += `<@${userID}>`;
  }
  if (roleID && roleID !== 'hogehoge') {
    mentions += `<@&${roleID}>`;
  }

  const payload = {
    content: `${mentions}通知に使う文章`.trim(),
    flags: 4096, // サイレントメッセージ
    embeds: [{
      title: "新規フォーム回答",
      color: 5814783,
      fields: fields,
      timestamp: new Date().toISOString()
    }]
  };

  try {
    UrlFetchApp.fetch(webhookUrl, {
      method: 'post',
      contentType: 'application/json',
      payload: JSON.stringify(payload)
    });
  } catch (error) {
    Logger.log(`エラーが発生しました: ${error.message}`);
    Logger.log(`スタックトレース: ${error.stack}`);
  }
}
  • ユーザーIDとロールIDはデフォルトのままor空白の場合、メンションされないようになっています(コード18-24行目)
  • flags : 4096部分でサイレントメッセージが有効化されます(コード28行目)
    • 全然調べても出てこなくて探し当てるのに苦労しました
  • embedのデザインは自由に変更できます(配色など)

ユーザーメンションとロールメンション

ユーザーに対してメンションをする際と、ロールに対してメンションをする際では差があります。

メンション先コード
ユーザー<@${UserID}>
ロール<@&${RoleID}>

かなり微妙な差異なので、いっそ統一してくれたらな、、と思います。

応用:スクリプトプロパティ

代入する値をコード上に平文で表示しておきたくない場合はプロパティサービスを使いましょう。

プロパティ サービス  |  Apps Script  |  Google for Developers

1
2
3
4
  const responses = e.response.getItemResponses();
  const webhookUrl = PropertiesService.getScriptProperties().getProperty('MyDiscord_WebhookURL');
  const userID = PropertiesService.getScriptProperties().getProperty('UserID');
  const roleID = PropertiesService.getScriptProperties().getProperty('RoleID');
発言は個人の見解であり、所属組織とは関係ありません。
Hugo で構築されています。
テーマ StackJimmy によって設計されています。