見出し画像

スプレッドシートの変更を監視し、変更されたらSlackに通知する仕組みをつくる

はじめに

会社で、スプレッドシートに命名規則のルールを集めていたのだが、誰かが変更すると、自分の知らないうちにいつの間にか変更されていたということが起こる。

もしかしたら、もっといい名前があったかもしれないのに、意見を言う前に決まってしまうのを避けたいと思った。

そこで、特定のスプレッドシートの列が更新されたらSlackに通知する仕組みをつくり、議論がSalck上でスタート&可視化できるようにした。

完成イメージ

特定のスプレッドシートの列が更新されたら

スクリーンショット 2020-04-13 15.51.14

Slackに下記のように自動で投稿される

スクリーンショット 2020-04-13 15.51.22

会社だとこんな感じでアイコンをキツネにしてかわいらしくしている

画像3

チームメンバーからは「キツネがきちんと監視してますねww」「狐いいですね」と高評価だった。

仕組み

名称未設定.002

Slackのトークンを取得する

ここでincoming webhookのアプリを自分のワークスペースに登録する。検索したら出てくるのでいれてください。

このような画面を開いたらSalckに追加する

スクリーンショット 2020-04-13 15.59.48

次に、投稿したいチャンネルを選んでインテグレーションを追加する

スクリーンショット 2020-04-13 16.00.03

Webhook URLが生成されるのでこれをメモしておく

スクリーンショット 2020-04-13 16.00.17

GASの設定

スクリプトエディタはこちら

スクリーンショット 2020-04-13 15.41.39

Slackのトークンを取得して、一番下の部分を置き換えてください

/
/新しく値が追加されたときに、Slackにお知らせする関数
function onEdit(e){
 var message = ""
 const eventObjects = e;
 //シートを取得
 var sheet = SpreadsheetApp.getActiveSheet(); 
 
 //cid命名ルール(随時更新)の場合動く関数
 checkUpdateOfcidSheet(sheet,eventObjects,message)
}


//cid命名ルール(随時更新)の場合動く関数
function checkUpdateOfcidSheet(sheet,eventObjects,message) {
 if (sheet.getName() != "監視するシート"){
    Logger.log("シートが監視するシートでなければ、この関数は終了")
    return 
 }
 
 //空白になった場合をわかりやすく
 if (eventObjects.value === void 0) {
   eventObjects.value = "空白";
 }
 
 //空白になった場合をわかりやすく
 if (eventObjects.oldValue === void 0) {
   eventObjects.value = "空白";
 }
 
 //アクティブセルを取得(どの列が変更されたか)
 var cell = sheet.getActiveCell(); 
 
 //アクティブセルがA列かを判定
 if(cell.getColumn()==1){ 
   message = "A列"
   if (eventObjects) {
     postMessage(eventObjects, message);
   }
 }
 
 //アクティブセルがC列かを判定
 if(cell.getColumn()==3){ 
   message = "C列"
   if (eventObjects) {
     postMessage(eventObjects, message);
   }
 }
}

/**
* スラックにPostする際の詳細の設定
*
* @ param object value
* @ return void
*/
function postMessage(eventObjects, message, options){
 
 //cid命名ルール(随時更新)の場合のSlackoption
 var options = {
   'method': 'post',
   'headers': {'Content-type': 'application/json'},
   'payload' : JSON.stringify({
     'attachments':[
      { 
        "fallback":"スプレッドシートアップデート通知",
        "color":"#36a64f",
        "fields":[
           {
              "title": "【" + message + '】が'+eventObjects.user+'によって更新されました',
              "value": '【変更点】 : 「' + eventObjects.oldValue + '」 が 「' + eventObjects.value + '」 に更新されました',
              "short":false
           }
        ]                                           
      }
     ]
   })
 };
 //ここの空白には取得したSlackのWebhook URLをはる
 UrlFetchApp.fetch("{https://hooks.slack.com/services/xxxxxxxx/xxxxxxxxxxxx/xxxxxxxxxxxxxxxxxx}", options); 
}

スクリーンショット 2020-04-13 15.47.14

スプレッドシートが更新されたら、このスクリプトを動かすように設定する

スクリーンショット 2020-04-13 15.47.39

お手本のスプレッドシートはこちら

私のSlackに通知が来るようになっていますが・・・お手本はこちらです。


エンジニアとして働いている成長記録やおもしろいと思ったこと色々書いていこうとおもいます 頂いたご支援は、資料や勉強のための本、次のネタのための資金にし、さらに面白いことを発信するために使います 応援おねがいします