2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GASに自動でバイトのシフトを組んでもらう ~リマインド編(Slack連携編)~

Last updated at Posted at 2022-05-08

1. 概要

この記事は前回の続きです.前回の記事はこちら
前回はシフトを自動で組むプログラムを作成しました.
今回は組んだシフトを参照し,当日シフトの人にSlackのDMでリマインドが届くようにしたいと思います.

2. イントロ

2-a. システム

前回の記事にも載せましたが,システム図を再掲します.
システム図

3. 実装

3-a. 下準備

リマインド通知を送るSlackのワークスペースを必要に応じて作ります.

3-b. Slackとの連携

今回は連携のために"Incoming Webhook"を用います.(公式記事 )
これは特定のSlackチャンネルにデータ(メッセージなど)を外部から送信することができるものです.
上記リンクのIncoming Webhookの設定を参考に,新規アプリを作成します.ここではアプリの名前をReminderとします.
作成が完了したら,slack apiのサイドバーから,FeaturesIncoming Webhooksにいきます.
incoming webhooks
Add New Webhook to Workspaceから,人数分のWebhookを作成します.Webhookはチャネル(DMの場合は人)ごとなので,人数分作成する必要があります.
作成した各Webhook URLに対してGASからリクエストを送ると,各チャンネルにデータ(メッセージ)が送信される,という具合です.

Webhook URLworkersシートにカラムを作って保存します.
webhook urlを記入

3-c. GASプログラミング

さて,workerスプシのAppScriptにもどって,reminder.gsを作成します.
コード内の実装手順は,

  1. wokerスプシのworkersシートから現在のメンバー情報を取得
  2. scheduleスプシのscheduleシートからシフト情報を取得
  3. 今日シフトの人全員にメッセージを送信.

※以下のコードではscheduleフォルダのフォルダIDを入力する必要があることに注意.

reminder.gs
function reminder() {
  //現在のworkerを取得
  const workerSS = SpreadsheetApp.getActiveSpreadsheet();
  const workerValues=workerSS.getSheetByName("workers").getDataRange().getValues();
  const workerNum = workerValues.length - 1;

  //現在の日付を取得
  let now = new Date();
  //今月を取得
  let date = now.getDate();
  let month = now.getMonth()+1;
  let year = now.getFullYear();
  let lastDay = getLastDay(year,month);
  month = ("0" + month).slice(-2);
  
  //シフト表を探索
  let scheduleFolder = DriveApp.getFolderById('ここにscheduleフォルダのフォルダIDを入力');
  let scheduleFiles = scheduleFolder.getFiles();
  let scheduleFileName = "schedule_"+year.toString()+month.toString();
  let scheduleName;
  let scheduleId;
  let scheduleURL;

  while(scheduleFiles.hasNext()){
    
    let file = scheduleFiles.next();

    scheduleName = file.getName(); // ファイル名
    scheduleId = file.getId(); // ファイルID
    scheduleURL = file.getUrl(); // ファイルURL

    if (scheduleName == scheduleFileName) 
    {
      console.log("Schedule hitted !")
      break;
    }
    else
    {
      scheduleName = null;
      scheduleId = null;
      scheduleURL = null;
    }
  }
  console.log([scheduleName,scheduleId,scheduleURL]);

  const scheduleSS = SpreadsheetApp.openById(scheduleId).getSheetByName('schedule');

  
  let assigneeRange = scheduleSS.getRange(3+date,3,1,workerNum);
  let assigneeValues = assigneeRange.getValues();
  console.log(assigneeValues);

  // ここからSlack
  //workersシートからメンバのwebhook urlを取得
  let memberUrls = []
  for(let m=0;m<workerNum;m++){
    memberUrls.push([workerValues[m+1][0]+workerValues[m+1][1],workerValues[m+1][4]])
  }

const message = "本日バイトのシフトよろしくお願いいたします";
  
  var jsonData =
  {
     "username" : "通知時に表示されるユーザ名",
     "icon_emoji": "通知時に表示されるアイコン",
     "text" : message
  };
  var payload = JSON.stringify(jsonData);
  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };
  //シフト表に記入がある人全員に対してメッセージを送信
  for(let p=0;p<assigneeValues[0].length;p++){
    if(assigneeValues[0][p].length > 0){
      UrlFetchApp.fetch(memberUrls[p][1], options);
      console.log("Reminded to "+memberUrls[p][0]);
    }
  }
}
}

実行すると,シフト表の今日の欄に記入がある人に対してDMが送られている事が確認できる.

3-d. リマインドの定期実行

リマインドを毎日自動で送るには,トリガーを設定する必要があります.
GASのサイドバーのトリガーから,トリガーを追加をクリックして以下のように設定します.
トリガ設定
時間は好きな時間を選択します.1時間単位で設定でき,その間のどこかで実行されます.

まとめ

slackと連携してGASからリマインドメッセージを送る方法を紹介しました.
当日シフトの人にDMするって,毎日を考えるとなかなか大変なことですが,これが一番確実なリマインド方法ですよね.
自動化によってバイトのすっぽかし人間がいなくなったので効果ありです(^v^)

2
2
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
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?