オタフ☆クラブ

Slack botを使って今週の掃除当番はどこだ問題を解決してみた!

slackの画面

日々オフィスで過ごしているといつの間にか身の回りが散らかってくるものですが、オフィスの乱れは心の乱れ、心の乱れはニューロンの乱れ。ニューロンを磨く前にオフィスの掃除をしましょう。

こんにちは、オタフ☆クラブのクロちゃんです。

実はですね、オフィスの掃除でよくある「今日の掃除誰?担当は何?問題」はSlack botで簡単に解決できちゃうかもしれません。

オタフ☆クラブでは隔週金曜日にみんなでオフィスの掃除をしています。これまではGoogleスプレッドシートに当番表(誰がどこを・何を担当するか)を用意し、それを全体に共有することで当番を管理していました。

しかし、掃除場所の確認のために各人がわざわざ指定のスプレッドシートを開いて、見にいかなければならなく、ちょっぴり非効率。それにみんなが表の編集をできるため、誰かが当番ローテーションを進めたことに気づかずにさらに別の誰かが進めてしまい、当番がスキップされてしまうこともしばしば。

↓こんな感じで一人ひとりの掃除担当を選択してました。

掃除当番表

かねてからオタフ☆クラブ内でも、「当番の制度がよくわからない」、「いつも掃除機ばっかりしている気がする」という意見がありました。

そう、僕らはAI開発会社のエンジニアなので「このままではいかん!」と思い立ち、この問題をスマートに解決すべく、Slackと連携したお掃除通知Botを作成しました。

なので今回の記事ではオタフ☆クラブのお掃除通知Botを例に、Slack上で動くBotの作成手順を紹介します!

作成するBotは無料、かつ、少しのプログラミング知識があれば作成可能です。シンプルな動作であればプログラミング初心者でも数時間程度で作ることができるはずです。

これくらいの工数なら、普段の業務にも支障が出ない範囲でBotを作成できるのではないでしょうか。

それではさっそくサワディーカップ。

クロちゃん
クロちゃん

「みなさんの業務でもなんだかちょっぴり非効率な作業などありませんか?Botを使って解決しちゃいましょう」

今回作成するBotの説明

今回作るBotは、Slackで特定のコマンドを入力するとその日の掃除場所を決めてくれ、全体にアナウンスしてくれるものにします。(コマンドは/soujiにしますが、自由に決めることができます。)

Bot作成における前提事項

  • 社内コミュニケーションツールにSlackを使っている。
  • Googleスプレッドシートを社内で使ってもOK。
  • JavaScriptをちょっと知っている。(注)

(注)シンプルなBotを作成するだけなら専門的なプログラミング知識は必要ありません。基礎文法をちょっとだけ知っている程度で問題ありません。

クロちゃん
クロちゃん

変数、配列、for文がわかればダイジョーブ、安心して。

スプレッドシートに掃除当番表を用意する

作成するBotはスプレッドシートの当番表の情報を元に、掃除場所を決めてくれる仕組みにします。

はじめに、スプレッドシートに下図のような当番表を準備しましょう。

スプレッドシートの掃除当番表

B列の<@xxx> はSlackのメンバーIDです。Botがメンションを飛ばしてくれるようにしたかったので表に入れましたが、メンションをしない場合はこの列は必要ありません。

クロちゃん
クロちゃん

メンションとはSlackで個人に通知を届ける仕組み。Botに限らず、あんまりメンションを多用しすぎるとうざがられるので注意して。

 

当番表が準備できれば、ツールバーの「ツール→スクリプトエディタ」をクリックしましょう。プログラムの入力画面が表示されます。

myFunction()という関数がはじめから用意されているので、そのなかにテスト用の下記のコードを打ち込んでください。

function myFunction() {
  Logger.log('hello, world')
}

そして実行ボタンをクリック。

するとログに文字列が出力されるはずです。もしBotを作成中にバグが発生してしまったら、このログを使ってデバグすることができます。

最初のログ

クロちゃん
クロちゃん

ログはツールバーの「表示→ログ」から確認することができるよ。

ログがきちんと表示されていることが確認できたら、次にSlackからリクエストを受け取れるようにしましょう。

テスト用に作成したコードを下記に変更してください。

function doPost(e) {
  var response = {text: 'test'}
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON)
}

関数名をmyFunction()からdoPost(e)に変更することに注意してください。こうすることで、Slackからのリクエストを受け取れます。そして、ツールバーの「公開→ウェブアプリケーションとして導入」をクリックします。

ウェブアプリケーション導入

上図のような設定画面が表示されるので、アプリケーションにアクセスできるユーザーを「全員(匿名ユーザーを含む)」へ変更しましょう。

ウェブアプリケーションのURLという画面が表示されるのでURLをコピーしておいてください。

SlackのワークスペースにAppを追加する

続いてこちら(https://api.slack.com/)のSlack APIのページへアクセスしてください。そして、Start Buildingをクリック

新しいSlack Appを作成するモーダルが表示されるので、アプリ(=Bot)の名前を入力し、インストール先のワークスペースを選択してください。

お掃除Bot作成

今回はデモ用に名前をお掃除通知Botとしました。

クロちゃん
クロちゃん

名前は後から変えられるので気軽に決めていいよ。

次に、メニューのBasic informationからSlash Commandsの作成へ。

スラッシュコマンドとは

“スラッシュコマンドは、 Slack での特定のアクション に対応するショートカットとして機能します。使い方は、メッセージフィールドにスラッシュコマンドを入力し、Enter キーを選択して送信するだけ。ワンステップでタスクを実行できます!”
https://get.slack.help/hc/ja/articles/201259356-%E3%83%93%E3%83%AB%E3%83%88%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B

Create New Commandをクリックすると、設定画面が出てくるのでコマンドとリクエストURLを入力してください。

コマンド設定

  • コマンド
    →どういうコマンドを入力するとBotが起動するか。今回は/soujiとしました。
  • リクエストURL
    →コマンドが入力されたときにBotがリクエストを送るURL。
    コピーしたウェブアプリケーションのURLを入力してください。

Short DescriptionやUsage Hintは後で決められるので空欄でかまいません。

これでSlack上にBotを作成することができました。ワークスペースへインストールしましょう。Slack APIのメニュー、Install Appからインストールすることができます。

インストールができれば、そのワークスペース上でコマンドが入力できるようになっているはずです。テストしてみましょう!

メッセージ入力欄に先程決めたコマンドである/soujiを入力すると下図のようにサジェストが表示され、

Slackのサジェスト

送信すると、

テストメッセージ

無事にテストメッセージを受け取ることができました!

クロちゃん
クロちゃん

完成まであともうちょっと。

スプレッドシートと連携し、当番表を読み取る

当番表を準備したスプレッドシートをもう一度開きましょう。

スプレッドシートのURLの”/spreadsheets/d/”と”/edit”に囲まれた英数字をコピーしてください。

ブラウザのアドレスバーに「https://docs.google.com/spreadsheets/d/******/edit#gid=0」と表示されていれば、******の部分です。(実際は40〜50文字ほどの長さです。)

そして再びスクリプトエディタを開き、スクリプトを下記に変更してください。

function doPost(e) {
  var obj = SpreadsheetApp.openById('コピペした英数字')
  var sheet = obj.getSheetByName('当番表を準備したシート名')
  var lastrow = sheet.getLastRow()
  var values = sheet.getRange(1, 2, lastrow, 2).getValues()
  var names = []
  var roles = []
  for(var i = 0; i < values.length; i++) {
    names.push(values[i][0])
    roles.push(values[i][1])
  }
  Logger.log(names)
  Logger.log(roles)
}

少しコードの補足説明をします。

var obj = SpreadsheetApp.openById('さっきコピペした文字列')
var sheet = obj.getSheetByName('当番表を準備したシート名')

この部分でスプレッドシートへアクセスしています。

var lastrow = sheet.getLastRow()
var values = sheet.getRange(1, 2, lastrow, 2).getValues()

当番表を読み取っています。

当番表は二次元配列の形で読み込まれるのでその後に続く処理で、メンバーの名前(names)と役割(roles)の配列へ整形しています。

実行すると下図のようなアクセス権限を求められることがあります。

アクセス権限

左下の詳細をクリックして、このスクリプトからGoogleドライブへのアクセスを許可しましょう。

ログを表示すると、スプレッドシートに準備した名前(SlackユーザーID)と掃除当番がそれぞれ配列で出力されていることがわかります。

当番表のログ

無事にスプレッドシートの情報が読み取られていることがわかりました。これで完成間近です。

最後に、読み取った情報にテキストを追加・整形してSlackへ通知します。

今回はデモのためshuffleという関数を用意し、当番をランダムに入れ替えて通知してみました。

function doPost(e) {
  var obj = SpreadsheetApp.openById('コピペした英数字')
  var sheet = obj.getSheetByName('当番表を準備したシート名')
  var lastrow = sheet.getLastRow()
  var values = sheet.getRange(1, 2, lastrow, 2).getValues()
  var names = []
  var roles = []
  for(var i = 0; i < values.length; i++) {
    names.push(values[i][0])
    roles.push(values[i][1])
  }

  var text = '今日の掃除場所\n'
  roles = shuffle(roles)

  for(var i = 0; i < names.length; i++) {
    var role = names[i] + ' さん、' + roles[i] + '\n'
    text += role
  }

  var response = {text: text, response_type: 'in_channel'}
  return ContentService.createTextOutput(JSON.stringify(response)).setMimeType(ContentService.MimeType.JSON)
}

function shuffle(array) {
  var result = []
  for(var i = array.length; i > 0; i--) {
    var index = Math.floor(Math.random() * i)
    var val = array.splice(index, 1)[0]
    result.push(val)
  }
  return result
}

ここで注意ですが、スクリプトを変更した場合、もう一度ウェブアプリケーションとして公開する必要があります。

このとき下図のようにバージョンをNewへ設定してください。

ウェブアプリケーション公開設定

ウェブアプリケーションの公開が完了し、Slackから/soujiと入力すると、

Botからのメッセージ

名前と掃除場所がBotから通知されています!分担場所もランダムにシャッフルされています。

(注)テスト用にユーザーIDをダミーにしたので名前の部分が表示されていませんが、実際はメンションされていることを確認していました。

ただのBotではつまらないので一工夫

最後に、いかにもBotな感じでは味気もなく、私のポリシーにも反するので「お掃除通知Bot」から「掃除の分担を決めるネコ」に変更し、Botへ命を吹き込みます。

アイコンも子猫の写真にして、テキストもそれっぽくすれば完璧です。

これにて完成!

隔週金曜は掃除の日です。Slackで/souji と入力すると、

掃除を決めるネコ

ネコがお知らせしてくれました!

まとめ

さて、今回はSlackとGoogleスプレッドシートを連携したお掃除通知Botの作り方を紹介してきました。少しのプログラミング知識があれば初心者でも作成可能な内容でしたよね!

Slackと連携させた通知Botは定期実行の設定もできるので、たとえば夕方にゴミ捨てのリマインドをしてくれるBotや、曜日や時間が決まった作業のリマインドなどにも応用できます。忘れがちなルーティン作業をサポートしてくれる強い味方になること間違いなしです!

実際にオタフ☆クラブでは「今日の掃除担当どこ?」とガヤガヤすることがなくなり、かつ掃除当番を今回作った「掃除の分担を決めるネコ」がランダムに決めてくれるので、皆が納得しやすい&ちょっとしたドキドキ感も生まれました。

ぜひ、みなさんそれぞれの目的に合わせて自分たち専用のBotを作成してみてくださいね。
それではよきBotライフを。サワディーカップ。

参考文献
Slash CommandsとGASでSlackのオリジナルコマンドをつくる
【初心者向けGAS】スプレッドシートのセル・セル範囲とその値を取得する方法 | いつも隣にITのお仕事

燃やせ探究心!突き詰めろ美しきソースコード!オタフ☆クラブ

コメントをどうぞ

トップへ戻る
タイトルとURLをコピーしました