Menu

Category

Archive

logo


SlackとGoogleドキュメントの連携 ~ Google Apps Script

2014-10-28 08:30:00 +0900
  • このエントリーをはてなブックマークに追加

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);  
}