Google Apps ScriptでSlackにメンテナンス通知を送る方法|簡単ステップガイド

目次

はじめに

前回の記事では、Google Apps Script (GAS)からSlackへ通知を送る方法「Slack Incoming Webhooks Apps」の作成方法をご紹介しました。今回は、指定時刻に自動で通知を送る方法を説明します。

必要なもの

  • Slack Incoming Webhooks Apps
  • Google Apps Script
  • Google Spreadsheet

要件

メンテナンスの告知をSlackに送るシーンを想定し、以下の要件を満たすスクリプトを作成します。

  • 毎朝9時頃にスケジュールをチェックし、メンテナンスがあれば通知を送る。
  • 当日にメンテナンスがあれば、メンテナンス開始10分前に再通知を送る。
  • メンテナンス内容が設定されていれば、通知メッセージにその内容を加える。

スプレッドシートの設定

通知を送る日時の設定をスプレッドシートの「スケジュール」シートを使って行います。以下のルールで入力します。

  • 1行目: 日付
  • 2行目: メンテナンス開始時間
  • 3行目: メンテナンス終了時間
  • 4行目以降: 1列目に施策名を記入し、リリースする日付の列に「開始」と入力
日付6/36/46/56/66/76/86/9
メンテ開始15:0014:0014:00
メンテ終了16:0016:0016:00
施策1開始
施策2開始
施策3開始
施策4開始
施策5開始
施策6開始
Spreadsheet 「スケジュール」シート例

GASスクリプトの実装

以下のスクリプトを使用して、要件を満たす通知を設定します。

  • 関数の説明
    • sendSlackNotification() 関数の詳細については、前回の記事をご参照ください。
    • createDailyTrigger() 関数を実行すると、翌朝9時頃に checkMaintenanceSchedule() 関数が実行されます。この関数により、当日にメンテナンスがある場合は、開始時刻の10分前に再通知が送信されます。
      • スプレッドシートIDはスケジュールシートを開いたURLの次の部分を指します。https://docs.google.com/spreadsheets/d/[スプレッドシートID]/edit
  • 特殊な処理
    • 施策内容の保存と再取得: メンテナンスの施策内容はスクリプトプロパティに保存され、10分前の通知時に取り出されます。再取得する方法も可能ですが、スクリプトプロパティを使用することで、簡便にデータを管理しています。
  • 動作確認方法
    • 動作確認を行う際は、以下の手順でコードを調整してください:
      1. // debug ラインのコメントを解除します。
      2. checkMaintenanceSchedule() 関数を実行します。
    • これにより、日付を「6/13」にシミュレートして動作確認が行えます。
function checkMaintenanceSchedule() {
  deleteAllTriggers();
  var spreadsheetId = 'SPREADSHEET_ID'; // スプレッドシートIDを設定
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName('スケジュール');
  var data = sheet.getDataRange().getValues();
  var today = new Date();
  // debug
  // today.setDate(6);
  // today.setHours(13);
  // today.setMinutes(50);
  // today.setSeconds(0);
  var dateString = Utilities.formatDate(today, Session.getScriptTimeZone(), 'yyyy/MM/dd');
  
  // 1行目の日付を探す
  for (var i = 0; i < data[0].length; i++) {
    var sheetDate = new Date(data[0][i]);
    var sheetDateString = Utilities.formatDate(sheetDate, Session.getScriptTimeZone(), 'yyyy/MM/dd');
    if (sheetDateString === dateString) {
      // メンテナンス開始時刻を取得
      var startTime = data[1][i];
      var endTime = data[2][i];
      var startColumn = i;
      
      if (startTime) {
        // メンテナンスの詳細を取得
        var details = [];
        for (var j = 3; j < data.length; j++) {
          if (data[j][startColumn] === '開始') {
            details.push(data[j][0]);
          }
        }
        
        var maintenanceTime = Utilities.formatDate(startTime, Session.getScriptTimeZone(), 'H:mm') + 
        '〜' + 
        Utilities.formatDate(endTime, Session.getScriptTimeZone(), 'H:mm');

        var detailMessage = details.length > 0 ? ' メンテ内容:\n' + details.join('\n') : '';
        var immediateMessage = '本日は' + maintenanceTime + 'にメンテナンスがあります。\n' + detailMessage;
        sendSlackNotification(immediateMessage); // 即時通知
        
        var reminderMessage = 'メンテナンスが10分後に開始されます。\n' + detailMessage;
        
        // メンテナンス開始時刻の10分前に通知を送るトリガーを設定
        var startDateTime = new Date(today.getFullYear(), today.getMonth(), today.getDate(), startTime.getHours(), startTime.getMinutes());
        var notifyTime = new Date(startDateTime.getTime() - 10 * 60 * 1000); // 10分前

        ScriptApp.newTrigger('sendSlackNotificationFromTrigger')
          .timeBased()
          .at(notifyTime)
          .create();
        
        // トリガーのメタデータを保持する
        PropertiesService.getScriptProperties().setProperty('slackReminderMessage', reminderMessage);
      }
      break;
    }
  }
}

function sendSlackNotificationFromTrigger() {
  var message = PropertiesService.getScriptProperties().getProperty('slackReminderMessage');
  if (message) {
    sendSlackNotification(message);
    PropertiesService.getScriptProperties().deleteProperty('slackReminderMessage');
  }
}

// 毎日午前9時頃にメンテナンススケジュールをチェックするトリガーを設定
function createDailyTrigger() {
  ScriptApp.newTrigger('checkMaintenanceSchedule')
    .timeBased()
    .atHour(9)
    .everyDays(1)
    .create();
}
// トリガーを全削除
function deleteAllTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
  Logger.log('All triggers have been deleted.');
}

function sendSlackNotification(message) {
  var url = "[Slack Webhooks URLを指定]";
  
  var payload = {
    "channel": '[投稿するチャンネルのID]',
    "text": message
  };

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

  UrlFetchApp.fetch(url, options);
}

実行結果

結果はこちらです。

施策内容がある場合はSlackに次のように表示されます。

まとめ

今回はより実用的な例として、GASを使って指定時刻にSlackへ通知を送る方法を紹介しました。
この記事を参考に、是非業務の効率化を図ってみてください。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

現役エンジニア。仕事とガジェットが好き。技術ブログを書くことは自分の役に立つのか?を検証。まったり情報発信しながら少しでも誰かの役に立てれば幸いです。

目次