SlackとGASで祝日には送らないリマインダーを作ってみた
背景
経常業務を滞りなく遂行すべく、リマインドを送りたかった
仕事上のコミュニケーションツールがSlackだった
週末や祝日は対応しないため送られないようにしたかった
要件
Slack上で指定した日時に特定のchでユーザーグループにメッセージを送る
メッセージは毎週水曜日の09:00 ~ 10:00に送るものとし、祝日は送らない
祝日はGoogleカレンダー「日本の祝日」を参照する
スケジューリングはトリガーで設定し、スクリプトには書かない
今回は送信時間を厳密に指定する必要が無いため
Slack公式リマインダーは使用せずWebhook経由でメッセージを送る
Slack公式リマインダーは祝日の概念が無いため
分岐処理などはGASを使用する
スクリプト例
webhookURLはSlackの管理画面内で確認できます
notificationDayでは送信する曜日を 0 ~ 6 の数字で指定しています
0は日曜日から始まり、6は土曜日を表します
calenderIDはGoogleカレンダーの「日本の祝日」に紐付けられているIDです
<!subteam^****> ではユーザーグループを指定しています(*****はIDを入れます)
function sendMessage() {
const WebhookURL = 'https://hooks.slack.com/services/*****/*****/*****';
// 水曜日に送る場合
const notificationDay = 3; // 0:Sun, 1:Mon, ..., 6:Sat
// Googleカレンダー「日本の祝日」を取得
function setHoliday(date) {
const calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
const calendar = CalendarApp.getCalendarById(calendarId);
const events = calendar.getEventsForDay(date);
return events.length > 0;
}
// 送信する内容
const messageContent = ' <https://***********|テキストリンク>を付けて、メッセージを送る';
// 現在時刻を取得
const current = new Date();
const weekDay = current.getDay();
const currentTime = Utilities.formatDate(current,'JST','HH:mm');
// 条件分岐
if (weekDay === notificationDay && currentTime) {
if (!setHoliday(current)) {
const payload = {
text: "<!subteam^*****>" + messageContent,
channel: '#チャンネル名',
};
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
};
UrlFetchApp.fetch(WebhookURL, options);
}
}
}
これで毎週水曜日の午前09:00 ~ 10:00に特定のchに特定のユーザーグループ宛にリマインダーが自動的に送られ、祝日の場合は送られなくなります。