概要
以下の要件を満たす必要がありました
- 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');
|