概要
職場では毎週掃除の日があり、輪番で掃除の役割を回しています。
毎回手動で色々するのはめんどうくさいので、うまいことやって Slack とかで適当にその日の当番を教えてくれると便利ですね。
というわけで、掃除の時間帯になったら、その日の掃除当番を Slack に通知してくれる BOT を作成してみます。
使うもの
- Google スプレッドシート + Google App Script(GAS)
- Slack Web API
当番データの準備
Google スプレッドシートで以下のようなデータを作成します。
| Member | Role | 
|---|---|
| 東方 | トイレ掃除 | 
| 空条 | 階段ほうき | 
| 広瀬 | 1F掃除機 | 
| 虹村 | ゴミ捨て | 
| 岸辺 | デスク掃除 | 
| 山岸 | 2F掃除機 | 
| 矢安宮 | 休み | 
Slack Web API token の取得
以下などを参考に、Slack Web API を利用するための token を適当に取得しておきます。
Slack APIを使用してメッセージを送信する
Google Apps Script の作成
先ほど準備したスプレッドシートの組み込みスクリプトとしてコードを書きます。
GAS の使い方がわからない場合は、こちらなどを参考にしてください。
SlackApp ライブラリの導入
まず、GAS で楽に Slack を扱うために、SlackApp ライブラリといういい感じのライブラリを導入します。
エディタの画面のメニューより リソース > ライブラリ を選択します。
「ライブラリを検索」に SlackApp ライブラリのキーを入力します。
M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO
SlackAppライブラリが追加されますので、バージョンを選択して、「保存」をクリックします。
GAS コード
それでは、実際に動作させるスクリプトのコードを書いてみます。
//slack定義
var slack = {
  postUrl: "https://slack.com/api/chat.postMessage",
  token: "(token)",  //取得したSlackWebAPIのtoken
  ChannelId: "(ChannelId)",  //投稿するチャンネルのChannelId
  userName: "Achtung Baby",  //botの名前
  iconEmoji: ":sunglasses:"  //botのアイコン
}
//メンバー・役割のデータをスプレッドシートから取得
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet()
var lastrow = sheet.getLastRow();
var members = sheet.getSheetValues(2, 1, lastrow-1, 1);  //データ行のみを取得する
var roles = sheet.getSheetValues(2, 2, lastrow-1, 1); //データ行のみを取得する
//メンバーに掃除当番を割当ててSlackで通知する
function notifyCleaningRole() {
  //平日のみ実行
  var currentDate = new Date();
  var weekday = currentDate.getDay();
  if (weekday == 0 || weekday == 6) {
    return;
  }
  //祝日は実行しない
  var calendar = CalendarApp.getCalendarById('ja.japanese#holiday@group.v.calendar.google.com');
  if (calendar.getEventsForDay(currentDate, {max: 1}).length > 0) {
    return;
  } 
 
  //本日の当番を割り当てる
  var msg = "";  
  var todaysRoles = rotate(roles);  
  for(var i = 0; i < todaysRoles.length; i++){
    msg = msg + ">" + (members[i]+ "     ").slice(0,4) + ": " + todaysRoles[i] + "\n";
    //割り当てた結果をスプレッドシートにも反映させる
    sheet.getRange(i+2, 2).setValue(todaysRoles[i]);
  } 
  
  //Slackにメッセージを送る
  var slackApp = SlackApp.create(slack["token"]);
  var Message = slackApp.postMessage(
    slack["ChannelId"], "<!channel> 本日の掃除当番:dusty_stick:\n\n \n" + msg + "", {
      username : slack["userName"],
      icon_emoji: slack["iconEmoji"]
    } 
  ); //@hereだと何故かデスクトップ通知されないため、仕方なく@channelを使う
}
//配列の要素を後ろにずらして、最後の要素を先頭に移動する
function rotate(array){
  array.unshift(array[array.length-1])
  array.pop();
  return array;
}
雑なコードですね 
スプレッドシートからメンバーと役割を取得して、役割を回してから postMessage メソッドを使って Slack にメッセージをpost、という処理をしています。
実行されるごとに掃除の役割が順番に回っていきます。
なお、お休みの日に出社して掃除したくないので、平日のみ割当と通知を実行するようにしています。
トリガーの設定
掃除の日の掃除開始前ぐらいに通知して欲しいので、スクリプトを定期実行するようトリガーを設定します。
トリガーってなんのこっちゃという場合は、こちら。
掃除開始前の時間帯に設定の上、notifyCleaningRoleファンクションを指定し、「保存」をクリック。
これで掃除開始前にスクリプトが定期実行されます。サーバーレスでいいですね。
実行イメージ
こんな感じで BOT が掃除当番を教えてくれます。
参考
毎週のお掃除当番をSlackへランダムで通知する
大変参考になりました 


