見出し画像

Google Apps Script(GAS)でSlackに当番通知するBotを作成してみた!

目的

掃除当番、お花の水やり当番、給食当番など色々な当番がありますが、その日の当番って意外と忘れがちで『今日の当番って誰?』ってことありませんか?
今の会社では朝会のファシリテーター(進行役)をメンバーで回しているのですが、意外と当番を忘れがちです。
今回はそんなことを無くすために当番通知Botを作成してみました!

方針

まず、スプレッドシートに『当番シート』と『祝日シート』を作成し、関数を使い営業日とその日の当番を書いたテーブルを用意します。次に、Slackに通知するためにメンバーとSlackのIDを持つテーブルを用意し、GASで当日の当番を通知するコードを書いていきます。

実装

ステップ1:スプレッドシートに祝日シートを作成

まずは、営業日一覧を作成するために、当番シートと祝日シートを用意します。祝日シートは以下のようなものを用意します。『エクセル 祝日一覧』とかで検索すると、ダウンロードできる親切なページがヒットするので、利用させてもらいましょう!

祝日シート

ステップ2:メンバーのSlackID(メンバーID)を取得

各メンバーのプロフィールからSlackIDIDを取得しておきましょう。メンバーIDは下図の『メンバーIDをコピー』から取得できます。

Slackのプロフィール

ステップ3:スプレッドシートに当番シートを作成

date列とfacilitator列(当番列)を持つ当番テーブルとメンバーとSlackIDを持つメンバーテーブルを作成します。

当番テーブルとメンバーテーブル

ここで営業日の取得には関数を利用しています。A列2行目に基準となる日付を入力し、A列3行目に以下の関数を入力してオートフィルして営業日一覧を作成しています。facilitator列はその日の当番をベタ打ちしています。

// date列:土日祝を除いた日付を求める
=WORKDAY($A$2,ROW()-2,'祝日'!$A$2:$A$34)

次に、メンバーと先ほど取得したSlackIDを使ってメンバーテーブルを作成します。2つのテーブルを作成したら、関数を使ってテーブルを結合します。

関数を利用してテーブルを結合

2つのテーブルを関数を利用して結合しています。今回はIFS関数を使いSlackIDをだし分けしました!

// slackId列
=IFS($B3="伊藤",$F$2,$B3="五十嵐",$F$3,$B3="伊地知",$F$4,$B3="井ノ原",$F$5,$B3="井上",$F$6)

ステップ4:SlackチャンネルにIncoming WebHooks 追加

Slackの公式ドキュメントで追加方法が記載されているので、手順通り進めてWebHooks URLを取得しましょう!

ステップ5:Apps Scriptでコードを実装

スプレッドシートの『拡張機能』タブから『Apps Script』を選択しコードを実装していきます。当番の日付と今日の日付を比較して、一致する場合、そのレコードの人にメンションするように実装してます。

// 日付の型
const DATE_FORMAT = "yyyy/MM/dd";

// メインルーチン
function postFacilitator() {
  // 対象のシートを取得します
  const sheet = getTargetSheet();
  if(!sheet) {
    Logger.log('sheet not found');
    return false;
  }

  // 当日のファシリテーターを記録した行を取得
  const targetRow = findRow(sheet, getDate(new Date(), DATE_FORMAT), 1, true);
  // 休日など、当番表にない日付にプログラムが実行された場合には何もせず終了する
  if (targetRow == 0) {
    return;
  }
  // 当日のファシリテーターの情報を取得
  // [date, facilitator,slackId]
  const target = sheet.getRange(targetRow,1,1,sheet.getLastColumn()).getValues()[0];
  // メンバーのslackIdを取得
  const targetSlackId = target[2];
  const message = '<@' + targetSlackId + '>' + '\r\n本日の朝会のファシリテーターお願いします。' ;
  // slackへpost
  postSlack(message);
}

// シート取得関数
function getTargetSheet() {
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet = spreadsheet.getSheetByName('当番');
  return sheet;
}

// 日時情報を指定のフォーマットに直す
function getDate(date, format){
  return Utilities.formatDate(date, 'Asia/Tokyo', format);
}

// スプレッドシートから特定の値を含む行の番号を取得
function findRow(sheet, val, col, isDate){
  var dat = sheet.getDataRange().getValues();
  for(var i=1;i<dat.length;i++){
    // 日付で検索する場合は、スプレッドシートの日付セルと型を合わせる必要がある
    if(isDate){
      if(getDate(new Date(dat[i][col-1]), DATE_FORMAT) === getDate(new Date(val), DATE_FORMAT)){
        return i+1;
      }
    }else if(dat[i][col-1] === val){
      return i+1;
    }
  }
  return 0;
}

// 渡されたtextをSlackに投稿する
function postSlack(text){
  var url = "https://hooks.slack.com/services/xxxxx/xxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxx";
  var options = {
    "method" : "POST",
    "headers": {"Content-type": "application/json"},
    "payload" : '{"text":"' + text + '"}'
  };
  UrlFetchApp.fetch(url, options);
}

ステップ6:トリガーを設定

最後に実行時間を設定していきます。時計アイコンを選択し実行する関数や時間を設定します。実行時間は1時間単位で設定するので午前9時~10時と設定したら、その時間のどこかで関数が実行されます。

トリガー設定
トリガーの設定項目

これで毎朝、当番宛てに通知されます。

まとめ

今回はGoogle Apps Script(GAS)とSlackのIncoming WebHooksインテグレーションを使って、当日の当番にメンションする当番通知Botを作成しました。
皆さんも掃除当番、植物の水やり当番などに利用してみてください!


この記事が気に入ったらサポートをしてみませんか?