Google Apps Script (GAS)を使った業務効率化「社員へのリマインドを自動化してみた」

当社では毎月実施するセキュリティチェックなど提出期限の決まった定型業務があります。
担当者が提出期限前に口頭やメールなどでリマインドを行ってくれていますが、定期的にリマインドを送る担当者の負担になってしまいます。
今回はGoogle Apps Script (GAS)を使ってGoogleスプレッドシートとSlackを連携させて、提出期限のリマインドを自動化して担当者の負担を減らす方法をご紹介します。
INDEX
Slackの設定
まずはSlackアプリを新規作成します。以下のURLにアクセスしてCreate an AppボタンからSlackアプリを作成します。

Create an Appを選択するとモーダルでアプリ名とWorkspaceの入力を促されます。
Slackにログインしていればログイン中のWorkSpaceが表示されるので、適当なアプリ名とWorkSpaceを選択してください。
右下のCreate Appボタンを選択すると基本情報画面が表示されます。

ローカルナビゲーションのIncoming Webhooksを選択してIncoming Webhooksの設定画面に移動します。

Activate Incoming WebhooksのボタンをOnに変更します。

ボタンをOnに変更すると画面下に新たにWebhook URLの一覧が表示されます。
初めてアプリを作成する場合はURLが何も登録されていませんので、Add New Webhook to Workspaceボタンから新規追加します。


Allowを選択すると先程の画面にWebhook URLが追加されます。

新規作成されたWebhook URLは後程使用するのでCopyボタンを押してメモしておきましょう。
Slackの設定は以上です。
Googleスプレッドシートにデータを入力する
Googleスプレッドシートには以下のような想定で作成してみました。
- 最初の列は提出期限日
- 最初の行に提出者の名前
- 提出済みの人には✔ボタンを付ける
- 提出日時に未提出(✔がない)人にリマインドを通知する

Google Apps Scriptを作成する
Googleスプレッドシートの画面からGoogle Apps Scriptを作成します。
ページ上部のナビゲーションからツール ⇒ スクリプトエディタを選択すると別ウィンドウでスクリプトエディタが開きます。
Google Apps Scriptにコードを追加する
スクリプトエディタには以下のコードを記述しました。
function main() {
var sheet = SpreadsheetApp.getActiveSheet();
var data = sheet.getDataRange().getValues();
var today = new Date();
var lastCol = sheet.getLastColumn();
// 1行目にある名前の一覧を取得します
var names = data[0].slice(1, lastCol);
Logger.log(names);
// 今日の日付と一致する一列目の日付の行を取得します
var found = data.slice(1, data.length).filter(function (row) {
var dueDate = row[0];
return Utilities.formatDate(today, 'Asia/Tokyo', 'YYYY/MM/dd') === Utilities.formatDate(dueDate, 'Asia/Tokyo', 'YYYY/MM/dd');
})[0];
Logger.log(found);
// 日付が一致しない時は何もしません
if (typeof found === 'undefined') {
return false;
}
// 未提出の名前の一覧を作成します
var unsubmitted = [];
found.slice(1, found.length).forEach(function (value, index) {
if (value.length === 0) {
unsubmitted.push(names[index]);
}
});
Logger.log(unsubmitted);
// 未提出の人がいる場合はSlackでメッセージを送信します
if (unsubmitted) {
sendMessageToSlack(Utilities.formatDate(found[0], 'Asia/Tokyo', 'YYYY/MM/dd'), unsubmitted);
}
}
function sendMessageToSlack(dueDate, unsubmitted) {
var url = '先程コピーしたWebhook URL';
var payload = {
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "提出期限は" + dueDate + "までです\n未提出の方は早めに提出するように頑張りましょう"
}
},
{
"type": "divider"
},
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": ":japanese_ogre: 未提出者"
}
},
{
"type": "section",
"fields": unsubmitted.map(function(name) {
return {
"type": "plain_text",
"text": name,
"emoji": true
};
})
}
]
};
var params = {
"method": "post",
"contentType": "application/json",
"payload": JSON.stringify(payload)
};
var response = UrlFetchApp.fetch(url, params);
変数urlの値を先程メモしておいたWebhook URLに書き換えます。
function sendMessageToSlack(dueDate, unsubmitted) {
var url = '先程コピーしたWebhook URL';
payloadのAPIの詳細は以下のリファレンスを参考にしてください
Slackへの通知の整形方法はBlock Kit Builderが便利でした。
Google Apps Scriptの動作を確認する
実際にSlackにメッセージが送信されるか確認してみましょう。
※当日の日付の時にしかメッセージを送信しないので、Googleスプレッドシートに当日の日付の行を追加します。

スクリプトエディタの実行ボタンを選択して、スクリプトを実行します

初めての場合は認可処理を求められるので許可を確認を選択します。


警告画面が表示されますが、左下の詳細ボタンからアプリを選択します。


アプリを選択するとGoogleアカウントへのリクエスト許可画面が表示されるので内容を確認して許可を選択します。

無事Slackに通知が届きました。

Google Apps Scriptにトリガーを追加する
このままではスクリプトエディタ画面から実行ボタンを押す時だけしか実行されません。
定期的に自動で実行されるようにGoolge Apps Scriptにトリガーを設定していきます。
スクリプトエディタの現在のプロジェクトのトリガーボタンからトリガーの設定をします。

トリガーの一覧画面右下のトリガーを追加ボタンを選択します。

イベントのソースを選択で定期的に実行したい時間を適宜設定します。 今回は以下の通り設定してみました。
| イベントのソース | 時間主導型 |
|---|---|
| 時間ベースのトリガーのタイプ | 週ベースのタイマー |
| 曜日を選択 | 毎週月曜日 |
| 時刻を選択 | 午前9時~10時 |

これで定期的に実行されるようになりました!
さいごに
駆け足ですがGoogle Apps Scriptを使ってGoogleスプレッドシートのデータからSlackに通知を送るまでの流れをお伝えしました。
面倒な事は自動化してより重要な業務にフォーカスできるようにしていきたいですね。
この記事を書いた人

- 事業開発部 web application engineer
- 2013年にアーティスに入社。システムエンジニアとしてアーティスCMSを使用したWebサイトや受託システムの構築・保守に携わる。環境構築が好き。
関連記事
最新記事
FOLLOW US
最新の情報をお届けします
- facebookでフォロー
- Xでフォロー
- Feedlyでフォロー
