概要
私の所属する部署では出社が当番制になっていて、担当割をExcelで管理しています。
しかし、毎回それを見て自分の出社日を確認するのは面倒なので、「Googleスプレッドシートの出社表から自分の出社日を探し、その前日に「明日は出社日!」とSlackにリマインダーを送信してくれるスクリプト」を作りました。
処理の流れはこんな感じです。
- トリガーを設定し、スクリプトを毎日実行する
- スプレッドシートから自分の出社日の前日を取得
- 「スクリプトの実行日」と「2で取得した日」が一致したとき、リマインド用のトリガーを設定
- リマインド用トリガーを実行し、Slackにリマインダーを送信
作成したスプレッドシート
体裁は以下の通りです。
- 使用する列はA~Eまでの5列
- 1行目はタイトル
- 2行目は日付のみ
- 3行目から日付+担当者割
2行目については、実装上の都合でこうなっています。(対象の担当者名を探索し、その前日の日付を取得するため)
実装
- 出社日の探索
スプレッドシートのキーは、URLの????????の部分です。
https://docs.google.com/spreadsheets/d/????????/edit
function searchWorkDay(){
  //スプレッドシートを取得
  var obj = SpreadsheetApp.openById("スプレッドシートのキー");
  var sheet = obj.getSheetByName("シート名");
  var lastRow = sheet.getLastRow();
 
  //実行日を取得
  let date = new Date();
  var today = Utilities.formatDate( date, 'JST', 'yyyyMMdd')
  Logger.log(today);
  
  let workDay = null;
  
  //対象文字列の探索
  loop: for(var i=3; i<=lastRow; i++){
    for(var j=2; j<=4; j++){
      //未通知の出社日を探索
      if(sheet.getRange(i, j).getValue() === "探索したい文字列" && !sheet.getRange(i, 5).getValue()){
        //1日前の日付を取得
        workDay = sheet.getRange(i-1, 1).getValue();
        var r_workDay = workDay.replace(/-/g, "");
        
        //出社日の前日とスクリプトの実行日が同じである場合、トリガーを設定する
        if(r_workDay === today){
          Logger.log(r_workDay);
          sheet.getRange(i, 5).setValue("done");
          
          setTrigger();
        }
          break loop;
      }
    }
  }
  Logger.log("complete");
}
- トリガーの設定
function setTrigger(){
  delTrigger();
  //実行日の9時00分にリマインド用トリガーを設定する
  const time = new Date();
  time.setHours(9);
  time.setMinutes(00);
  ScriptApp.newTrigger('postSlack').timeBased().at(time).create();
  
  Logger.log(time + "にトリガーを設定しました");
}
function delTrigger(){
  
  //設定済みリマインド用トリガーを削除する
  const triggers = ScriptApp.getProjectTriggers();
  for(const trigger of triggers){
    if(trigger.getHandlerFunction() === "postSlack"){
      ScriptApp.deleteTrigger(trigger);
    }
  }
  Logger.log("トリガーを削除しました");
}
- Slackに送信
参考にした記事
SlackのIncoming WebhookでのURL取得方法
function postSlack(){
  var text = "明日は出社日!";
  var payload  = {
    'text'      :  text, 
  };
  
  var options = {
    'method'      : 'post',
    'contentType' : 'application/json',
    'payload'     : JSON.stringify(payload),
  };
  var url = 'SlackのIncoming Webhookで取得したURL';
  UrlFetchApp.fetch(url, options);
}
毎日実行するトリガーの設定
毎日1~2時の間に実行する設定にしています。
参考にした記事
時限式のトリガー設置方法
実行結果
こんな感じで通知されます!
アイコンや表示名についても任意で変更可能です。
参考にした記事
Incoming webhookまとめ

まとめ
今回は、スプレッドシートから自分の出社日の前日を取得し、Slackにリマインダーを送信するスクリプトを作ってみました。
次は、SlackのOutgoing Webhookを用いて、「次の出社日は?」と投稿したら結果が得られるようにしてみたいと思います!

