Google Apps Scriptを使ってSlackとスプレッドシートを連携させました。アンケートの集計結果等がGoogleフォームにより、スプレッドシートに記入された際に、その内容がSlackに飛ぶようにしました。これで、Slackを使っているチームであれば、わざわざスプレッドシートのURLを共有したりする必要がなくなり、便利です。
Google Apps Scriptでスプレッドシートの送信する文字列の準備
Google Drive内で、Google Apps Scriptのプロジェクトを作成します。Newボタン、Moreと進み、Google Apps Scriptを探し選択します。Google Apps Scriptは、Googleサービスと連携でき、ドライブ上のファイル等を操作することができます。基本はJavascriptで書くことができます。まずは、Slackに飛ばす文章をスプレッドシートの情報をもとに作成します。この関数を定期的に実行されるように設定します。これはメニュー上の時計のアイコンから簡単に設定できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | function myFunction() { var ss = SpreadsheetApp.openById('********'); var data = ss.getDataRange().getValues(); var scriptProperties = PropertiesService.getScriptProperties(); var lastCount = parseInt(scriptProperties.getProperty('LAST_COUNT')); if (lastCount == data.length) { Logger.log("No new data!"); return; } else { Logger.log("We have new data!"); var newDataCount = data.length - lastCount; var lastIndex = lastCount - 1; // Let's check the difference for (var i = 1; i <= newDataCount; i++) { var os = data[lastIndex + i][1]; if (!os || os.length == 0) { os = "No info"; } var device = data[lastIndex + i][2]; if (!device || device.length == 0) { device = "No info"; } var body = "------------------------------------------------------------------------------------\n*日付* : " + data[lastIndex + i][0] + "\n" + "*OS* : " + os + "\n" + "*端末* : " + device + "\n*コメント* : \n" + data[lastIndex + i][3] + "\n------------------------------------------------------------------------------------"; sendToSlack(body); } } // Save current data count scriptProperties.setProperty('LAST_COUNT', data.length.toString()); } |
2行目の SpreadsheetApp.openById
のIDはスプレッドシートを開いている時のURLから確認することができます。このスプレッドシートを2次元配列として扱い、行と列を指定して情報を取得します。PropertiesService.getScriptProperties
は、前回この関数が実行された時に、このスプレッドシートが何行持っていたのかを保存しています。前回の列の数と現在の列の差分の分だけ、Slackに飛ばす文字列を作成しています。そのぶんだけ新しい情報があるということです。body変数に送信する文字列を格納しています。アスタリスクで囲むことにより、Slack上で太文字で表示されます。
Slackに送信
myFunction()
で作成したSlackに飛ばしたい文字列をこのsendToSlack(body)
で実際にSlackに送信します。Slackの拡張機能のIncoming WebHooksにアクセスすると、下記のようなURLを指定されるので、そこにPostします。他にもたくさんのAPIがあります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function sendToSlack(body) { var url = "https://****.slack.com/services/hooks/incoming-webhook?token=****"; var data = {"channel": "#your_channel", "username": "webhookbot", "text": body, "icon_emoji": ":ghost:"}; var payload = JSON.stringify(data); var headers = {"Accept":"application/json", "Content-Type":"application/json", "Authorization":"Basic _authcode_" }; var options = { "method" : "POST", "contentType" : "application/json", "headers" : headers, "payload" : payload }; var response = UrlFetchApp.fetch(url, options); } |