0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GASでSlackのメッセージを制御する

Last updated at Posted at 2025-02-06

これは何?

  • Google App ScriptでSlackを制御するためのスクリプト例です
    • 経常業務に掛かる稼働の軽減を図ることを目的としています

土日祝を除外したリマインダー

  • WebhookURLを取得する
  • 参照する「日本の祝日」カレンダーを指定する
    • 祝日の場合は送らないように定義する
    • 年末年始の12/27-01/03も除外する
  • メッセージ文とリンクを指定する
  • 投稿先のチャンネルとユーザーグループを指定する
  • 送信時刻を指定する
    • 別途トリガーを指定時刻の1時間前付近で設定しておく
function sendNotification() {
  // send mention automatically
  var slackWebhookUrl = 'https://hooks.slack.com/services/xxx';

  // 祝日を定義
  function isHoliday(date) {
    var calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
    var calendar = CalendarApp.getCalendarById(calendarId);
    var events = calendar.getEventsForDay(date);
    return events.length > 0;
  }

  // 年末年始を定義
  function isYearEnd(date) {
    var month = date.getMonth() + 1; // getMonth() returns 0-11
    var day = date.getDate();
    return (month === 12 && day >= 27) || (month === 1 && day <= 3);
  }

  // 投稿内容を定義
  var mentionMessage = ' メッセージ文 ( <https://xxxxxx|テキスト> )';

  // 現在の日時等を取得
  var now = new Date();
  var dayOfWeek = now.getDay();
  var currentTime = Utilities.formatDate(now, 'JST', 'HH:mm');

  // 祝日と年末年始を除いた平日に通知されるようにセット
  if ( 0 < dayOfWeek && dayOfWeek < 6  ) {
    // send mention without holiday
    if (!isHoliday(now)&&!isYearEnd(now)) {
      var payload = {
        text: "<!subteam^ユーザーグループID>" + mentionMessage,
        channel: '#チャンネル名',
      };
      var options = {
        method: 'post',
        contentType: 'application/json',
        payload: JSON.stringify(payload),
      };
      UrlFetchApp.fetch(slackWebhookUrl, options);
    }
  }
  deleteTrigger()
}

// タイマーをセットする
function setReminder(){
  var time = new Date();
  time.setHours(11);
  time.setMinutes(00);
  time.setSeconds(00);
  ScriptApp.newTrigger('sendNotification').timeBased().at(time).create();
}

// トリガーの削除する(溜まると発火しなくなるため)
function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "sendNotification") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

毎週水曜日のリマインダー

  • WebhookURLを取得する
  • 参照する「日本の祝日」カレンダーを指定する
    • 祝日の場合は送らないように定義する
    • 年末年始の12/27-01/03も除外する
  • メッセージ文とリンクを指定する
  • 投稿先のチャンネルとユーザーグループを指定する
  • 送信時刻を指定する
    • 別途トリガーを送信時刻の1時間前付近で設定しておく
    • トリガーを削除する(トリガーが溜まり過ぎると動かなくなるため)
function sendNotification() {
  // send mention automatically
  var slackWebhookUrl = 'https://hooks.slack.com/services/xxxx';

  // designate time and day of week
  var notificationDay = 3; // 0:Sun, 1:Mon, ..., 6:Sat

  // check holiday
  function isHoliday(date) {
    var calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
    var calendar = CalendarApp.getCalendarById(calendarId);
    var events = calendar.getEventsForDay(date);
    return events.length > 0;
  }

 // check YearEnd
  function isYearEnd(date) {
    var month = date.getMonth() + 1; // getMonth() returns 0-11
    var day = date.getDate();
    return (month === 12 && day >= 27) || (month === 1 && day <= 3);
  }

  // content
  var mentionMessage = ' <https://xxxx|テキスト>を確認して完了報告をしてください!';

  // get action date
  var now = new Date();
  var dayOfWeek = now.getDay();
  var currentTime = Utilities.formatDate(now,'JST','HH:mm');

  // set Wednesday
  if (dayOfWeek === notificationDay && currentTime) {
    // send mention without holiday
    if (!isHoliday(now)&&!isYearEnd(now)) {
      var payload = {
        text: "<!subteam^ユーザーグループID>" + mentionMessage,
        channel: '#チャンネル名',
      };
      var options = {
        method: 'post',
        contentType: 'application/json',
        payload: JSON.stringify(payload),
      };
      UrlFetchApp.fetch(slackWebhookUrl, options);
    }
  }
  deleteTrigger()
}

// Set Trigger
function setReminder(){
  var time = new Date();
  time.setHours(11);
  time.setMinutes(00);
  time.setSeconds(00);
  ScriptApp.newTrigger('sendNotification').timeBased().at(time).create();
}

function deleteTrigger() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    if (triggers[i].getHandlerFunction() == "sendNotification") {
      ScriptApp.deleteTrigger(triggers[i]);
    }
  }
}

毎月月初○営業日目のリマインダー

  • WebhookURLを取得する
  • 参照する「日本の祝日」カレンダーを指定する
    • 祝日だった場合は翌営業日に送るように定義する
  • メッセージ文とリンクを指定する
  • この例では月初5営業日と定義する
  • 投稿先のチャンネルとユーザーグループを指定する
function sendNotification() {
  // send mention automatically
  var slackWebhookUrl = 'https://hooks.slack.com/services/xxx';

  var today = new Date();

  // 参照するGoogleカレンダーを定義
  var calendarId = 'ja.japanese#holiday@group.v.calendar.google.com';
  var calendar = CalendarApp.getCalendarById(calendarId);
  var holidays = calendar.getEventsForDay(today);

  // content
  var mentionMessage = ' メッセージ<#チャンネルID|テキスト>';

  // 月初5営業日目を計算
  var businessDays = 0;
  var date = new Date(today.getFullYear(), today.getMonth(), 1);
  while (businessDays < 5) {
    if (date.getDay() != 0 && date.getDay() != 6 && calendar.getEventsForDay(date).length == 0) {
      businessDays++;
    }
    if (businessDays < 5) {
      date.setDate(date.getDate() + 1);
    }
  }

  if (today.getDay() == 0 || today.getDay() == 6 || holidays.length > 0) {
    return;
  }

  // 今日が月初5営業日目かどうかを確認
  if (today.getDate() != date.getDate()) {
    return;
  }

  var payload = {
    channel: '#チャンネル名',
    text: "<!subteam^ユーザーグループID>" + mentionMessage,
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload),
  };

  UrlFetchApp.fetch(slackWebhookUrl, options);
}

最後に

少しクセがありますが、慣れるとかなり便利なSlackをより便利にしてやりましょう!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?