みなさん、こんにちは。どんぶラッコです。
スプレッドシートを課題管理表として活用されている方、多いのではないでしょうか。
こんな感じのやつです。
それと同時に、「更新があった部分を定期的に通知してほしい…」と思うことがあるのではないでしょうか?
ということで、更新があったらSlackに通知するシステムを作りました。
30分おきに変更があった課題をチェックし、課題番号ごとに変更部分を通知してくれます。
今回はこのサンプルプログラムを掲載&解説していきます!
Incoming Webhooks を設定
まずはSlackに通知を飛ばすためのアプリ設定をします。
Incoming Webhooks を追加してください。
設定が完了すると Webhook URL が発行されるので控えておきましょう。
Google App Script で編集
さていよいよ GAS の設定です。
まずは ツール → スクリプトエディタ を開きます
今回は4つの関数を作成します。 checkUpdate()
, createMessage()
, postSlack()
, setBackupSheet()
です。
フローを図に起こすとこんな感じです。
30分に1回 checkUpdate()
関数を実行するように仕向けます。
まずはそれぞれの関数を作成していきましょう。
function checkUpdate() {
var message = createMessage()
if(message != ""){
postSlack(message)
setBackupSheet()
}
}
メッセージを作成し、message
変数が空じゃなければSlackに通知を飛ばしてバックアップシートを作成します。
次にメッセージを作成する関数です。
function createMessage() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var currentSheet = sheet.getSheetByName("課題洗い出し")
var prevSheet = sheet.getSheetByName("backup")
var result = ""
console.log('差分チェックを開始します...')
for(var row=1; row<200; row++){
var isChanged = false
var task = '---\nNo.' + currentSheet.getRange(row, 1).getValue() + '\n' + ''
for(var col=1; col<13; col++){
if(currentSheet.getRange(row, col).getValue() !== prevSheet.getRange(row, col).getValue()){
task += currentSheet.getRange(1, col).getValue() + ': ' + currentSheet.getRange(row, col).getValue() + '\n'
isChanged = true
}
}
task += '\n'
if(isChanged){
result += task
console.log(row + '行目' + 'に変更を検知しました')
}
if(col==2){
console.log(currentSheet.getRange(row, col).getValue(), prevSheet.getRange(row, col).getValue())
}
}
if(result != ""){
result = '■■■更新がありました■■■\n\n' + result
}
console.log('作成されたメッセージ:')
console.log(result)
return result
}
7行目、10行目で差分をチェックする列数、行数を指定しています。
ここら辺は自分たちの管理表に合わせて変更してください。
次に、slackへの通知部分です。
function postSlack(text) {
var url = 'https://hooks.slack.com/services/XXXXXXXXX'
var payload = {
channel: 'hogehoge',
text: text
}
var options = {
method: 'POST',
headers: {'Content-type': 'application/json'},
payload: JSON.stringify(payload)
}
UrlFetchApp.fetch(url, options)
}
url には 先ほど設定した slack webhooksのURL, channelには投稿したい先のチャンネル名を指定します。
最後に、バックアップシートを作成します。
下の例では 「課題」というシートを「backup」というシート名でコピーを作成しています。
function setBackupSheet() {
// 現在のスプレッドシートの取得・削除
var activeSpreadSheet = SpreadsheetApp.getActiveSpreadsheet()
var backup = activeSpreadSheet.getSheetByName("backup")
if(backup){
activeSpreadSheet.deleteSheet(backup)
}
// バックアップシートの作成
var tmpSpreadSheet = activeSpreadSheet.getSheetByName("課題")
var copySpreadSheet = tmpSpreadSheet.copyTo(activeSpreadSheet)
copySpreadSheet.setName("backup")
}
定期実行の設定
さて、最後に checkUpdate()
関数が定期実行されるように設定します。
時計マークをクリックします。
トリガーを追加をクリック
実行したい関数を checkUpdate, イベントのソースを時間主導型をそれぞれ選択します。ベースのタイマーは任意のものを選択してください。
最後に「保存」を押したら設定完了です!!
GASはちょっとしたアプリを作るのに便利ですね。みなさんも挑戦してみてください!