Slackとスプレッドシートでボタンを押すだけ簡単タスク実施記録
概要
こんなことをやります。
①定期的にSlackにボタンを送る
②誰かがSlack上でボタンを押す
③スプレッドシートにボタンを押した時間と押した人を記録する
④Slackのボタンが消える
弊社では入退室記録として使っていますが、例えば勤怠やルーティンタスクの記録など様々な用途に使えると思います。
書いている人
株式会社マインディアというマーケティングテクノロジーを扱う会社でBtoC・BtoB両方のマーケティングをしています。非エンジニアなので用語の説明やクエリの書き方など雑なところがあると思いますが、何か気になるところがあったら優しくご指摘くださいw
twitterアカウントはこちら
ぜひフォローしてくださいー!
背景
マインディアは定性調査業務を行っているため会員の個人情報を取り扱うことが多く、個人情報保護の目的でプライバシーマークを取得しています。その施策の一環として1日ごとにオフィスへの最初の入室、最後の退室の記録を取っています。
以前は原則としてオフィスに出社し業務を行う形式だったので勤怠と入退室時間が一致していたため勤怠記録のみを取得していたのですが、現在はリモートワークが中心となり勤怠と入退室時間が必ずしも一致しなくなりました。
それによって個別で入退室記録を取得する必要が出てきたことから、まずは手軽に始められる入退室記録として運用を始めました。
手順
① 記録用のスプレッドシートを作る
1枚目のシートにこんな感じで作っておきます。もちろん、最初は一行目の項目名以外は空白のままで大丈夫です。
そして2枚目のシートにSlackのメンバーIDと氏名の対応表を作っておきます。
メンバーIDはこちらを参考に取得してください。
② Slackでアプリを作ってWebhook URLを発行する
このあたりの記事を参考に発行してください。
③ ボタン送信用のスクリプトを書く
まず、スプレッドシートでボタン送信するためのGASを作ります。
function sendInToSlack(){
var webhookUrl = 'https://hooks.slack.com/services/**********; //①で取得したWebhookのURL
var text = ':sunrise: 入室確認です! :sunrise:'; //ボタン送信の際のメッセージ本文
var attachments = [{
"title": "おはようございます!", //ボタン表示のタイトル
"text": "1番に出社した方はこのボタンを押してください :smile:", //ボタンの上テキスト
"fallback": "この端末では表示できません", //ボタン表示できないときの表示メッセージ
"callback_id": "callback_button",
"color": "#ff8c00", //左の棒の色
"attachment_type": "default",
"actions": [
{
"name": "entry",
"text": "1番乗り!", //ボタン内のテキスト
"type": "button",
"value": "entry"
}
]
}];
var payload = {
"text": text,
"attachments": attachments
};
var options = {
"method" : "post",
"payload" : JSON.stringify(payload)
};
UrlFetchApp.fetch(webhookUrl, options); //Slackに送信する
}
このスクリプトはGASのタイマーを使って定期実行されるようにしておきます。この例では入室の確認をするためのものなので、出社定時の1時間前に実行されるようにしています。
④ボタンが押されたときの情報を取得するスクリプトを書く
スプレッドシートに押した人の名前と時間を記録しつつ、誰かが押したあとに間違えて別の人が押さないようにSlackのボタンを消します。
function doPost(e) {
// ボタンからのレスポンスを取得
var payload = JSON.parse(e["parameter"]["payload"]);
var value = payload["actions"][0]["value"];
var slackId = payload["user"]["id"];
// ユーザー名を取得
var userSheet = SpreadsheetApp.getActive().getSheetByName('ユーザーマスタ'); //シート名は実際にSlackのIDと氏名を記載しているシートの名前に変えてください
var textFinder = userSheet.createTextFinder(slackId);
var ranges = textFinder.findAll();
var row = ranges[0].getRow()-1;
var column = ranges[0].getColumn();
var index = userSheet.getDataRange().getValues();
var name = index[row][column];
// スプレッドシートに記録
var inOutSheet = SpreadsheetApp.getActive().getSheetByName('入退室記録'); //シート名は実際に記録をつけるシートの名前に変えてください
var inOutRanges = inOutSheet.getDataRange();
var lastRow = inOutRanges.getLastRow();
var now = new Date();
var date = Utilities.formatDate(now, 'Asia/Tokyo', 'yyyy/MM/dd');
var time = Utilities.formatDate(now, 'Asia/Tokyo', 'HH:mm:ss');
inOutSheet.getRange(lastRow+1,1).setValue(date);
inOutSheet.getRange(lastRow+1,2).setValue(time);
inOutSheet.getRange(lastRow+1,3).setValue(name);
// 入退室それぞれで文言を変えるためifで分岐しています。単一の処理なら1つで大丈夫です。
if (value == "entry") {
var text = name + "さんが出勤したよ!今日も頑張りましょう! :muscle:"; //Slackの本文の書き換え内容
inOutSheet.getRange(lastRow+1,4).setValue('入室');
} else {
var text = name + "さんが退社したよ!今日もお疲れ様でした! :beers:"; //Slackの本文の書き換え内容
inOutSheet.getRange(lastRow+1,4).setValue('退室');
}
// Slackのボタンを上書きする
var reply = {
"replace_original": true,
"response_type": "in_channel",
"text": text,
"attachments": [{
"title": "報告完了!",
"fallback": "この端末では表示できません",
"callback_id": "callback_button",
"color": "#00bfff",
"attachment_type": "default",
}]
};
var output = ContentService.createTextOutput(JSON.stringify(reply));
output.setMimeType(ContentService.MimeType.JSON);
return output
}
弱点
この方法は特別な機器の購入などがなく手軽に始められますが、1つ弱点があります。
誰もボタンを押さなかった日は「誰も出社しなかったのか」「出社したけど押し忘れたのか」が分からないことです。 ※リモートワーク前提でなければある時間までに押されていなければ通知する、ということもできるのですが。
現状弊社は人数が少なく朝会に全員参加のため誰が出社しているのかは把握できますが、人数が増えてくると難しくなります。そうなったらコストはかかりますがオフィスの鍵にスマートロックを導入するとかが現実的な解決策になってくるかなと思っています。
ぜひお話しましょう!
他にも業務効率化などに興味ある方はぜひ情報交換させてください!お気軽にMeetyまで!
よろしければサポートお願いします!そのうちオリジナルドメインにしたいなと思っているのでその資金にさせていただきます!