LoginSignup
1
0

More than 3 years have passed since last update.

出社日の前日にSlackへリマインダーを送信するスクリプト

Posted at

概要

私の所属する部署では出社が当番制になっていて、担当割をExcelで管理しています。
しかし、毎回それを見て自分の出社日を確認するのは面倒なので、「Googleスプレッドシートの出社表から自分の出社日を探し、その前日に「明日は出社日!」とSlackにリマインダーを送信してくれるスクリプト」を作りました。

処理の流れはこんな感じです。

  1. トリガーを設定し、スクリプトを毎日実行する
  2. スプレッドシートから自分の出社日の前日を取得
  3. 「スクリプトの実行日」と「2で取得した日」が一致したとき、リマインド用のトリガーを設定
  4. リマインド用トリガーを実行し、Slackにリマインダーを送信

作成したスプレッドシート

体裁は以下の通りです。

  • 使用する列はA~Eまでの5列
  • 1行目はタイトル
  • 2行目は日付のみ
  • 3行目から日付+担当者割

2行目については、実装上の都合でこうなっています。(対象の担当者名を探索し、その前日の日付を取得するため)

image.png

実装

  • 出社日の探索

スプレッドシートのキーは、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時の間に実行する設定にしています。

参考にした記事
時限式のトリガー設置方法

image.png

実行結果

こんな感じで通知されます!
アイコンや表示名についても任意で変更可能です。

参考にした記事
Incoming webhookまとめ
image.png

まとめ

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

1
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
1
0