Secret Ninja Blog

Support Engineering Director してます

Slackの複数チャンネル一斉通知の仕組みをGoogle SheetとGoogle App Scriptで作ってみた。

Slackを使っていて、いろんな活用をしている。 その活用の中で、営業やカスタマサクセスチームは、顧客との専用チャンネルを作り、顧客との密なコミュニケーションをしている。 何年か経ちそんなチャンネルもいっぱいになり、100を超えてくると、Slackで何か通知を出すのも一苦労だ。 自分の顧客にリリースノートを共有したくても、数十チャンネルにポストをしまくる必要がでてくる。

Slackで指定の複数チャンネルにまとめてメッセージを送る方法を探してみたが、意外と無い。

なのでSlackの複数チャンネル一斉通知の仕組みをGoogle SheetとGoogle App Scriptで作ってみた。

前提として、利用者はカスタマサクセスとか営業とかNot Engineerな人でも簡単に使える、ということがある。

利用の流れ

Step1

通知先チャンネルのシートに、通知対象のslackのチャンネル名を入れる。 f:id:toru-takahashi:20200513221301p:plain

Step2

通知内容の設定の通知内容にコメントを入れる。

f:id:toru-takahashi:20200513221424p:plain

Step3

通知用ボタンのボタンクリックをし、ポップアップでOKを押すと、一斉に通知される。

f:id:toru-takahashi:20200513221531p:plain

f:id:toru-takahashi:20200513221605p:plain

f:id:toru-takahashi:20200513221546p:plain

何十チャンネルにも同時に送る必要があるユースケースがどんくらいあるかわからないが、パートナーとのSlackチャンネルがいっぱいあってたまに同時配信したいとかそういうときは便利なんじゃなかろうか。

作り方

Google App Scriptのコード

通知用のコードはこんな感じ。シートとかの情報は固定箇所指定になっているので、上記の画像と同じフォーマットでシートを作る必要がある。

function postMessage() {
  
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  
  var channels = spreadsheet.getSheets()[0].getRange("A:A").getValues();
  Logger.log(channels);
  
  var message = spreadsheet.getSheets()[1].getRange("B1").getValue();
  Logger.log(message)
  
  var debug_flag = spreadsheet.getSheets()[1].getRange("B2").getValue();
  Logger.log(debug_flag);
  
  var confirmation = Browser.msgBox("下記の内容を通知しますか? (debug mode="+ debug_flag +")", message, Browser.Buttons.OK_CANCEL);
  if (confirmation == 'cancel') {
    Browser.msgBox("キャンセルします");
    return;
  }
  
  if(debug_flag) {
    postSlack("test-channel", message)
    return;
  }
  
  for(var i=0;i<channels.length;i++)
  {
    if(channels[i] != '') {
      Logger.log("Posted:" + channels[i]);
      var res = postSlack(channels[i][0], message);
      Logger.log(res);
    }    
  }
}

function postSlack(channel, message) {
  var payload = {
    "token" : PropertiesService.getScriptProperties().getProperty("SLACK_TOKEN"),
    "channel" : channel,
    "text" : message,
    "icon_emoji": ":hi:",
    "username": "Customer Success Announcement"
  };
  
  var params = {
    "method" : "post",
    "payload" : payload
  };
  
  return UrlFetchApp.fetch("https://slack.com/api/chat.postMessage", params);
}

設定サンプルのシートはこちら: Slack一斉通知のサンプル - Google スプレッドシート (コード自体は動作しないのであしからず。)