8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ZOZOAdvent Calendar 2022

Day 22

全社的なタスクをSlackで通知してくれるやつをサクッと作った

Last updated at Posted at 2022-12-21

概要

たまに全社的なタスクをしなければならないことがあります。(例.年末調整資料の提出)
全体チャンネル等でアナウンスはされるものの、忘れてしまうことがあります。また、チームリーダなどは回答状況を把握しておきたいということもあるかと思います。
この問題を解決するためにスプレットシート、Google App Script(以降、GAS)、Slack組み合わせて、未完了のタスクを定時で通知し、回答状況の管理をするアプリケーションをサクッと作ったので紹介します。

以下のスプレットシートをコピーすることで、スクリプトごとコピーされます。ぜひ利用してみてください。
https://docs.google.com/spreadsheets/d/170QtHwhLA0KHwzAxn9Q0_26IVBe386qiMjBWNzp8fY4/edit?usp=sharing

作ったもの

Slackに以下画像に示す内容が日次で通知されます。GASの定期実行によって、自分のチームのチャンネルに毎朝通知されるようにしています。
image.png

タスクはスプレットシートで管理します。
タスクは行に追加していきます。D列以降に対象者のSlack名を入力します。チェックマークの入っていない未完了のタスクが通知されます。
リンクにはSlackのリンク等を任意で設定します。
"Slack送信"というボタンを押すと、定期実行のトリガーを待たず手動でSlack通知が出来ます。記入直後に使うイメージです。
image.png

実装

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のスタンプリアクションでタスクやチェックマークを書き込めるようにしたら更に便利になるかと思っています。

8
1
0

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
8
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?