見出し画像

SlackとGASで祝日には送らないリマインダーを作ってみた


背景

  • 経常業務を滞りなく遂行すべく、リマインドを送りたかった

    • 仕事上のコミュニケーションツールがSlackだった

    • 週末や祝日は対応しないため送られないようにしたかった

要件

  1. Slack上で指定した日時に特定のchでユーザーグループにメッセージを送る

  2. メッセージは毎週水曜日の09:00 ~ 10:00に送るものとし、祝日は送らない

    1. 祝日はGoogleカレンダー「日本の祝日」を参照する

    2. スケジューリングはトリガーで設定し、スクリプトには書かない

      1. 今回は送信時間を厳密に指定する必要が無いため

  3. Slack公式リマインダーは使用せずWebhook経由でメッセージを送る

    1. Slack公式リマインダーは祝日の概念が無いため

  4. 分岐処理などは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に特定のユーザーグループ宛にリマインダーが自動的に送られ、祝日の場合は送られなくなります。