概要
たまに全社的なタスクをしなければならないことがあります。(例.年末調整資料の提出)
全体チャンネル等でアナウンスはされるものの、忘れてしまうことがあります。また、チームリーダなどは回答状況を把握しておきたいということもあるかと思います。
この問題を解決するためにスプレットシート、Google App Script(以降、GAS)、Slack組み合わせて、未完了のタスクを定時で通知し、回答状況の管理をするアプリケーションをサクッと作ったので紹介します。
以下のスプレットシートをコピーすることで、スクリプトごとコピーされます。ぜひ利用してみてください。
https://docs.google.com/spreadsheets/d/170QtHwhLA0KHwzAxn9Q0_26IVBe386qiMjBWNzp8fY4/edit?usp=sharing
作ったもの
Slackに以下画像に示す内容が日次で通知されます。GASの定期実行によって、自分のチームのチャンネルに毎朝通知されるようにしています。
タスクはスプレットシートで管理します。
タスクは行に追加していきます。D列以降に対象者のSlack名を入力します。チェックマークの入っていない未完了のタスクが通知されます。
リンクにはSlackのリンク等を任意で設定します。
"Slack送信"というボタンを押すと、定期実行のトリガーを待たず手動でSlack通知が出来ます。記入直後に使うイメージです。
実装
sendTodoという関数がメインの関数です。
タスクごとに未完了の対象者を抽出し、送信内容を組み立てているだけです。
function sendTodo() {
const SLACK_URL = 'https://hooks.slack.com/services/~'; // 通知したいチャンネルのSlack Webhook URL
const SPREAD_SHEET_URL = 'https://docs.google.com/spreadsheets/~' // spreadsheetのURL
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const input_sheet = spreadsheet.getSheets()[0];
const HEADER_LENGTH = 3
const member_count = input_sheet.getRange(1, 1, 1, 99).getValues()[0].filter(value => value !== '').length - HEADER_LENGTH
const todos = input_sheet.getRange(1, 1, 999, 3 + member_count).getValues().filter(value => value[0] !== '');
const member_list = todos[0].slice(3, 3 + member_count)
var message = ''
var send_flag = false
for(let todo of todos.slice(1)) {
if(!todo.slice(3).every(value => value)) {
send_flag = true
var year = todo[1].getFullYear();
var month = ("00" + (todo[1].getMonth() + 1)).slice(-2);
var date = ("00" + todo[1].getDate()).slice(-2);
if(todo[2] !== ''){
message = message + '*<' + todo[2] + '|' + todo[0] + '>*' + ' 期限:' + year + '/' + month + '/' + date + '\n'
}else{
message = message + '*' + todo[0] + '*' + ' 期限:' + year + '/' + month + '/' + date + '\n'
}
const not_do_member = todo.slice(3).map((value, index) => {
if(!value) {
return member_list[index]
}
}).filter(value => value !== undefined)
for(let member of not_do_member) {
message = message + "<@" + member + ">" + ' '
}
message = message + '\n\n'
}
}
if(send_flag && !isTodayHoliday()) {
var data = {
'text': "以下のタスクが終わってないよ!終わったら<"+ SPREAD_SHEET_URL +"|スプシ>にチェックを入れてね!\n" + message + "\n" + ""
};
var options = {
'method': 'post',
'contentType': 'application/json',
'payload': JSON.stringify(data)
};
UrlFetchApp.fetch(SLACK_URL, options);
}
}
// 土日かどうかのチェック
function isTodayHoliday() {
let today = new Date();
let weekInt = today.getDay()
if(weekInt <= 0 || 6 <= weekInt) {
return true;
}
return false;
}
まとめ
スプレットシート、GAS、Slackの組み合わせで全社的なタスクを通知してくれるアプリケーションを作成しました。GASはちょっとした自動化がサクッとできるのでとても重宝しています。
今後の展望として、Slackのスタンプリアクションでタスクやチェックマークを書き込めるようにしたら更に便利になるかと思っています。