Google App Script

【GAS × Slack】スプレッドシートの更新を定期的にslackに通知してみよう!

みなさん、こんにちは。どんぶラッコです。

スプレッドシートを課題管理表として活用されている方、多いのではないでしょうか。

こんな感じのやつです。

それと同時に、「更新があった部分を定期的に通知してほしい…」と思うことがあるのではないでしょうか?

グランくん
グランくん
いちいち確認しに行くのは面倒臭いよね!
どんぶラッコ
どんぶラッコ
更新確認を人力でするのは忘れるし手間がかかるし、いいことがありません。

ということで、更新があったら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はちょっとしたアプリを作るのに便利ですね。みなさんも挑戦してみてください!

ABOUT ME
どんぶラッコ
ECコンサルタント、システムエンジニアを経て、quintet株式会社CTOに就任。普段はNuxt.jsやLaravelを使用しています。

\面白いと思ったら/

記事のシェア & Twitter のフォロー をお願いします!

@proglearn
RELATED POST

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です