更新の見落とし防止に!
みなさん、こんにちは。どんぶラッコです。
以前スプレッドシートに更新があったらその更新内容をSlackチャンネルに投稿するというGASを組んだことがあります。
その時は 1時間おきに
- 1時間前のスプレッドシートコピーと1セルずつ比較していく
- 差分があったら、更新箇所を抽出しSlackに送信
- 最後に現状のスプレッドシートのコピーを作成
という挙動をさせていましたが、かなり非効率な上に総当たりで差分を確認していくので時間がかかりすぎて更新通知に失敗することもしばしば…
そこで私は思いました。
単にスプレッドシートの更新情報を確認すれば良いのでは?
スプレッドシートの内容が多くなければ、取り急ぎ「更新があったよ!」ということがわかるだけでもだいぶありがたいです。
ということで、今回のGASを組んでみました。
サンプルコード & 解説
function checkUpdatedInAnHour() {
const id = "FILE_ID"; // Google Drive の ファイルID
const file = DriveApp.getFileById(id); // ファイルオブジェクトの取得
const lastUpdated = file.getLastUpdated(); // 最終更新日時の取得
const now = new Date(); // 現在時刻の取得
const diffMs = now.getTime() - lastUpdated.getTime(); // 差分(ミリ秒) を取得
const diffMin = diffMs / 1000 / 60; // 差分(ミリ秒) を 差分(分)に変更
// 60分以内に更新があったら通知する
if(diffMin <= 60) {
postSlack('<https://example.com | サンプルスプレッドシート> に更新がありました');
}
}
// Slackの Incoming Webhook を利用
function postSlack(text) {
const url = 'https://hooks.slack.com/services/XXXX'
const payload = { text }
const options = {
method: 'POST',
headers: {'Content-type': 'application/json'},
payload: JSON.stringify(payload)
}
UrlFetchApp.fetch(url, options)
}
checkUpdatedInAnHour()
という関数を作り、その中で
- 現在日時 – 最終更新日時 をして差分の分数を取得
- もし差分が60分以下だったら更新があった旨をSlackに通知
というロジックで更新検知をしています。
60分以内に更新があったかどうかという条件分岐をしているのは、このcheckUpdatedInAnHour()
を1時間毎に実行することで、60分以上前の更新は既に通知済みとするためです。
なので、更新のタイミングによっては通知を逃す場合もあるので、より厳密に通知を実行したい場合は、別途通知を送信した日時をスプレッドシート上で管理する必要があります。
今回はある程度の誤差は許容できるので特に対策をしていません。
また、緊急の対応事項がある場合は直接DMが来ることになっているので、更新されたら即通知ではなく、1時間毎に確認をする仕様にしています。
更新毎にSlack通知をするように設定すると、1セルが更新されるたびに通知が走ってしまうのでそれはうるさすぎる、という事情もあったりします…
今回のGAS特有の文法としては以下の2行です。
const file = DriveApp.getFileById(id); // ファイルオブジェクトの取得
const lastUpdated = file.getLastUpdated(); // 最終更新日時の取得
DriveApp.getFileById(id)
の引数 id
は Google Drive のファイルIDのことです。
情報を取得したいファイルのURLを確認すると把握することができます。
そして file.getLastUpdated()
を実行することで、最終更新日時の Date オブジェクトを取得することができます。
なので、あとは現在時刻を取得してゴニョゴニョして最終更新日時が何分前なのかを計算させています。
また、Slackについては Incoming Webhookを設定してそのURLを引っ張ってきています。
詳しい使い方は公式ページを参照してみてください。
トリガーの追加
一通りコードを書けたらあとは1時間毎に checkUpdatedInAnHour()
関数が発火するように設定するだけです!
- 左側アイコンからトリガーを選択
- 画面右下の「トリガーを追加」を選択
- 実行関数を指定
- イベントのソースを「時間手動型」にし、1時間毎に発火するように設定
うまくいけば、ご自身が設定したチャンネルに↓↓のような通知が飛ぶはずです!
今回の記事のまとめ
噛み砕いてみるとそこまで難しくないですね。
ポイントは getLastUpdated()
を知っているか否かです!