LoginSignup
57
62

More than 5 years have passed since last update.

掃除当番の割当を Google Apps Script で自動化して Slack の BOT として通知

Last updated at Posted at 2016-04-18

概要

職場では毎週掃除の日があり、輪番で掃除の役割を回しています。
毎回手動で色々するのはめんどうくさいので、うまいことやって 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

gas_slackapp.png

SlackAppライブラリが追加されますので、バージョンを選択して、「保存」をクリックします。

GAS コード

それでは、実際に動作させるスクリプトのコードを書いてみます。

cleanup.gs
//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;
}

雑なコードですね :fearful:

スプレッドシートからメンバーと役割を取得して、役割を回してから postMessage メソッドを使って Slack にメッセージをpost、という処理をしています。
実行されるごとに掃除の役割が順番に回っていきます。

なお、お休みの日に出社して掃除したくないので、平日のみ割当と通知を実行するようにしています。

トリガーの設定

掃除の日の掃除開始前ぐらいに通知して欲しいので、スクリプトを定期実行するようトリガーを設定します。
トリガーってなんのこっちゃという場合は、こちら

gas_trigger.png

掃除開始前の時間帯に設定の上、notifyCleaningRoleファンクションを指定し、「保存」をクリック。
これで掃除開始前にスクリプトが定期実行されます。サーバーレスでいいですね。

実行イメージ

こんな感じで BOT が掃除当番を教えてくれます。

赤ちゃんはここにおる

参考

毎週のお掃除当番をSlackへランダムで通知する
大変参考になりました :bow:

57
62
2

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
57
62