見出し画像

GAS超入門⑤ - Slackに通知してみよう

はじめに

今回は、GASを使ってSlackへの通知方法を学びます。これを覚えておくだけで以下のようなことが簡単にできるようになります。

・ 月曜日の朝9時に営業状況をまとめてSlackに通知
・ 今日の予定を自分のSlackに通知する秘書botの作成
・ 残業時間が45時間を超えそうな社員のリストを通知
・ Twitterのフォロワーの増減数をSlackに通知

どうですか?夢が広がりますね!
では早速やっていきましょう!

SlackのIncoming Webhooks登録

まず、GASからSlackに通知するには、通知したいチャンネルにIncoming Webhooksというものを追加する必要があります。

※ ちなみに、まだSlackのアカウント持ってないよ。という人は以下の記事を参考にしてください。

まずは、Slackを開いて、「App」をクリックします。
すると右側に利用可能なアプリの一覧が表示されますので、検索窓に「Incoming」と入力してください。「Incoming WebHooks」が出てくるので「追加」ボタンを押します。

Slackのincoming_01


こうすると、ブラウザで別のタブが開いて以下の画面が出ます。
「Slackに追加」ボタンを押してください。

Slackのincoming_02


どこのチャンネルにGASから(正確には外部から)メッセージを送りますか?と聞かれるので、今回は「#gas連携テスト」というチャンネルを選択します。
(チャンネルはどこでもOKです)

画像6


チャンネル名を選択すると「Incoming webHookインテグレーションの追加」ボタンが出るのでクリック。

画像7


これで完了です。このwebhook URLを後のGASでコードを書く時に使いますのでコピーしておきましょう。

画像8

この「Webhook URL」を次のGASのコードで使いますのでコピーしておいてください。

GASのコードを作成

さて、下準備が整ったのでで、GASのコードを書いていきます。

function notifySlack() {
 let postUrl  = "【先程コピーしたwebhookURLをコピペ】"

 let userName = "テストbotくん"   // Slackに通知する時の名前になります
 let icon     = ":innocent:"    // 表示されるアイコン
 let message  = "これはGASからのテストメッセージです" // 送信するメッセージ

 // ここで以下をオプションに設定できます
 // username(通知者の名前)
 // icon_emoji(アイコン)
 // text (送信するメッセージ)
 let jsonData = {
   "username" : userName,
   "icon_emoji" : icon,
   "text" : message
 }  

 // 上の送信内容を設定  
 let payload = JSON.stringify(jsonData)

 // オプションを設定
 let options =
 {
   "method" : "post",
   "contentType" : "application/json",
   "payload" : payload
 };

 // Slackに通知する
 UrlFetchApp.fetch(postUrl, options);  
}

こんな感じでコピペしてください。

実際に通知してみる

さぁ、これでコードを実行してみます。

以下のようにいつもどおり認証を求められるので、承認してあげましょう。

画像1

画像2

画像3

できましたね!非常に簡単です。
例えば、このnotifySlack関数の引数にメッセージを受け取れるようにしておけば、スプレッドシートの中身からメッセージを生成して、通知。というのも簡単にできちゃいますね。

せっかくなのでやってみましょう!

【番外編】スプレッドシートの内容をSlackに通知する

まずは、営業部の部署別の目標額と売上、達成率を書いたスプレッドシートを作ります。

スクリーンショット 2020-07-07 00.29.23


ここのデータを取得するコードを書いていきます。

function generateSalesDataMessage() {
 let sheet = SpreadsheetApp.openByUrl("【スプレッドシートのURL】").getSheetByName("部門別達成率")
 let values = sheet.getRange(2,1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues()

 let message = ""

 // 各行から、部門別の目標額・売上・達成率のメッセージを生成する 
 for (value of values) {
   let division = value[0] // 部門
   let goal     = value[1].toLocaleString() // 目標額(toLocaleStringで3桁ずつカンマ区切りにしてる)
   let revenue  = value[2].toLocaleString() // 売上(toLocaleStringで3桁ずつカンマ区切りにしてる)
   let goalRate = Math.round(value[3] * 100 * 100) / 100 // 達成率
   message += `${division}は、目標額の${goal}円に対して、売上が${revenue}円で、達成率は${goalRate}%でした。\n`
 }

 return message       
}

2,3行目で、sheetオブジェクトの取得と、A2:D4までの値を取得して、values変数に格納してます。

また、この取得したvaluesをループで回して、メッセージを生成します。
目標額と、売上につけているtoLocalString()は、3桁づずカンマを入れる関数です。
goalRate = 達成率は、実際のデータとしては「98%」は「0.98」と入っているので、一旦100を書ける必要があります。

また、このままだと少数点が大量についてしまうので、Math.roundを使って小数点を切り捨てています。

簡単に説明しておきましょう。

例えば、個人営業部の達成率は、「103.1250000%」となっており、これは実際の数値は「1.03125000000」が入っています
まずこれに100を掛けることで「103.12500000」を取得。
さらに、小数点第二位までにするために、一旦100をかけて少数点を切り捨てます。
Math.round(goalRate * 100) => 10312
Math.round(goalRate * 100) / 100 => 10312 / 100 => 103.12
と、小数点第二位までを表示することができました。

さて、この「xxx部は目標額のxxxx円に対して、売上がxxxx円で、達成率はxx%でした」という文字列をSlackに送るため、先程作ったnotifySlack関数を少し編集します。

 * Slackに特定のメッセージを送信する
* @params message string 送信するメッセージ
*/
function notifySlack(message) {
 let postUrl  = "【取得したwebhook URL】"

 let userName = "テストbotくん"   // Slackに通知する時の名前になります
 let icon     = ":innocent:"    // 表示されるアイコン

 // ここで以下をオプションに設定できます
 // username(通知者の名前)
 // icon_emoji(アイコン)
 // text (送信するメッセージ)
 let jsonData = {
   "username" : userName,
   "icon_emoji" : icon,
   "text" : message
 }  

 // 上の送信内容を設定  
 let payload = JSON.stringify(jsonData)

 // オプションを設定
 let options =
 {
   "method" : "post",
   "contentType" : "application/json",
   "payload" : payload
 };

 // Slackに通知する
 UrlFetchApp.fetch(postUrl, options);  
}

変えたのは2点。
notifySlack関数の引数にmessageを受け取るようにした。
let iconの下に書いてた、テスト用のmessage変数を消した

これで、外部からこの関数を呼び出した時の文字列がそのままSlackに通知される訳ですね。

さて、最後の仕上げで、このメッセージを取得して、Slackに通知するmain関数を作ります (超シンプルですよ)

/**
* スプレッドシートから営業生成を取得して通知する関数
*/
function main() {
 notifySlack(generateSalesDataMessage())
}

これだけです。これでmain関数を実行してみましょう。

スクリーンショット 2020-07-07 01.01.24

無事に通知されました。

これでもうあなたは、GASで5万円くらいの案件を受注する知識は得られてました。
おめでとうございます!!

次は、chatworkへの通知とLINEへの通知方法も紹介していきます。

コードの全体像

/**
* スプレッドシートから営業生成を取得して通知する関数
*/
function main() {
 notifySlack(generateSalesDataMessage())
}

/**
* スプレッドシートからsalesの売上データの情報を文字列にして返す
* @return string 営業成績の文字列
*/
function generateSalesDataMessage() {
 let sheet = SpreadsheetApp.openByUrl("【営業成績が書かれたスプレッドシートのURL】").getSheetByName("部門別達成率")
 let values = sheet.getRange(2,1, sheet.getLastRow() - 1, sheet.getLastColumn()).getValues()

 let message = ""
 
 for (value of values) {
   let division = value[0] // 部門
   let goal     = value[1].toLocaleString() // 目標額(toLocaleStringで3桁ずつカンマ区切りにしてる)
   let revenue  = value[2].toLocaleString() // 売上(toLocaleStringで3桁ずつカンマ区切りにしてる)
   let goalRate = Math.round(value[3] * 100 * 100) / 100 // 達成率
   message += `${division}は、目標額の${goal}円に対して、売上が${revenue}円で、達成率は${goalRate}%でした。\n`
 }

 return message       
}

/**
* Slackに特定のメッセージを送信する
* @params message string 送信するメッセージ
*/
function notifySlack(message) {
 let postUrl  = "【SlackのwebhookURL】"

 let userName = "テストbotくん"   // Slackに通知する時の名前になります
 let icon     = ":innocent:"    // 表示されるアイコン

 // ここで以下をオプションに設定できます
 // username(通知者の名前)
 // icon_emoji(アイコン)
 // text (送信するメッセージ)
 let jsonData = {
   "username" : userName,
   "icon_emoji" : icon,
   "text" : message
 }  

 // 上の送信内容を設定  
 let payload = JSON.stringify(jsonData)

 // オプションを設定
 let options =
 {
   "method" : "post",
   "contentType" : "application/json",
   "payload" : payload
 };

 // Slackに通知する
 UrlFetchApp.fetch(postUrl, options);  
}



実践編で利用するための基礎編はすべて無料公開してます。 基礎編のモチベーション向上のためにサポートして頂けるとめちゃくちゃ喜びます!! だいたい作業工数は1記事あたり4-5時間程度かけて【分かりやすい】【知識が身につく!】を意識して作っておりますので、今後も頑張っていきます!