ブログ

【GAS】スプレッドシート上の当番表からSlackにリマインドを送信

ITツール紹介

2023.06.27

こんにちは
システム開発部の中木村です!
本記事ではスプレッドシートからSlackにリマインド通知を送る方法をご紹介します!
実際に使用しているコードも解説しますので、ぜひ最後までお読みください!

当番表の管理とリマインドの経緯

アイクラフト株式会社では24時間365日サーバー監視・運用保守を行っています。
そのため、土日祝は社員が交代で出勤し当番をしています。

当番表のExcelファイルを確認して出勤するのですが、Slackでリマインド通知を使った方が、効率が良いと思い通知するシステムを作成しました。

 

準備するもの

  1. Googleアカウント(GASを使用するため)
  2. スプレッドシート
  3. Slackで使用するwebhookのURL
  4. 通知するチャンネル

 

GAS(Google Apps Script)の概要

Google Apps Script(GAS)は、G Suite(現在のGoogle Workspace)のアプリケーションと連携してカスタムな自動化や機能拡張を実現するスクリプト言語です。
GASについては、こちらでも紹介していますので、ぜひご覧ください。

GASとSlack API連携

Slack webhookの概要

Slack webhookの設定方法については、以下で紹介しています

Slack APIについて

当番表の作成

まずは当番表をプレッドシートで作成していきます。
今回は入力シートにA列に担当日、B列に担当者名を入力していきます。
※交代前は記録のため残しているだけです

また通知日、判定の列も準備します。
今回は適当に
Kの列に通知日(二日前)
=A2-2

Lの列に通知の判定
=IF(B2<>“”,”ON”,”OFF”)

を入力しています。
 

名前とSlackのIDの紐づけ

メンバーという名前の別シートで作成します。


 

GASの実装

GAS スクリプトエディター画面で以下スクリプト貼り付けてください。
WebhookのURLは取得したものに変更してください。


function taskRemind() {
  // シート取得
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('入力シート');
  var slackSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('メンバー');

  // ループ数定義
  var firstRow = 2;
  var lastRow = sheet.getLastRow();

  // アラート対象日フォーマット
  var date = new Date();
  var remindDate = Utilities.formatDate(date, 'JST', 'yyyy/MM/dd (EEE)');

  // Slackメッセージ用の配列を初期化
  var messages = [];

  for (var i = firstRow; i <= lastRow; i++) {
    // 各項目取得
    var remindDay = sheet.getRange('A' + i).getValue();
    var contactPerson = sheet.getRange('B' + i).getValue();
    var closingDay = sheet.getRange('K' + i).getValue();
    var formatClosingDay = Utilities.formatDate(closingDay, 'JST', 'yyyy/MM/dd (EEE)');
    var status = sheet.getRange('L' + i).getValue();

    // スラックIDの取得
    var slackID = '';
    var slackIDs = slackSheet.getRange('B:C').getValues();
    for (var j = 1; j < slackIDs.length; j++) {
      if (slackIDs[j][0] === contactPerson) {
        slackID = slackIDs[j][1];
        break;
      }
    }

    // リマインド時
    if (formatClosingDay === remindDate && status !== 'OFF') {
      var formattedRemindDay = Utilities.formatDate(remindDay, 'JST', 'M月d日(E)');
      var message = `■担当日:${formattedRemindDay}\n■担当者:${slackID}`;
      messages.push(message);
    }
  }

  // Slackメッセージを送信
  if (messages.length > 0) {
    var postUrl = 'https://hooks.slack.com/services/xxxxxxx/yyyyyyyyy/zzzzzzzzzzzzzz';
    var message = `当番のお知らせ\n${messages.join('\n \n')}\n`;
    var payload = JSON.stringify({ "text": message });
    var options = { method: 'post', contentType: 'application/json', payload: payload };

    UrlFetchApp.fetch(postUrl, options);
  }
}

 

デバッグ

WebhookのURLの置き換えが完了したらデバッグしてみましょう。
Slackに通知がくることを確認してください。



 

トリガーの設定

トリガーの設定は左のメニューの時計マークからできます。右下のトリガーの追加を押してください。

今回は一日一回で良いので、時間主導型で午前11時~午後12時にしています。



 

さいごに

うまく試せましたか?
今後は以下内容を改修する予定です。
・月末に各メンバーの来月の日付一覧をBOTから各メンバーのDMに通知する
・休日判定を土日と祝日リストから判定するように変更
・休日なのに当番に名前がない場合はエラー文が表示されるようにする
最後までお読みいただきありがとうございました。
またお会いしましょう!

システム開発部では受託開発も行っています。お気軽にお問い合わせください。

お問い合わせはこちら

 

この記事を書いた人
中木村
アイクラフト株式会社
顧客サービス部 iSTAFF24Gr.

顧客サービス部の中木村です。
未経験で入社し、システムエンジニアを1年半、現在はインフラエンジニアとして働いています。
いろんな技術について触れていこうと思っています。
趣味は散財です。最近はISO配列の自作キーボードを買いました。
よろしくお願いします!

ITツール紹介の関連記事