スプレッドシートで管理しているKPIをSlackに自動投稿するGoogle Apps Scriptを作ってみた


[運営中のPlayer!](https://itunes.apple.com/jp/app/id897872395)のKPI管理として、SlackへのKPI自動投稿を行うようにしました！


## Slackへの自動投稿
DAUの前日比がプラスなら`:thumbsup:`、前日比がマイナスなら`:thumbsdown:`というふうにメッセージを出しわけてます。

![スクリーンショット 2015-06-26 21.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/58836/28c823be-c52c-a90f-6c31-28974a10271a.png)




## この記事の構成
僕が書いたコードを全て記載した上で、2部構成に分けて説明します。

__1.Google Apps ScriptでSlackのチャネルに投稿するのに必要な作業__

__2.スプレッドシートから値を取得し、投稿メッセージを作成するのに必要な作業__








## まずは、コードを全てお見せする


```js:コード.gs
// 共通部分
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '①', // Slackのtoken
  channelId: "②", // SlakckのチャネルのID
  userName: "お好きな名前で！！", // botの名前
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      text: text
    }
  });
}

// 数値元によって変更する箇所
function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[③];

 var dauvalues = sheet.getSheetValues(④)*100;
 var daybeforevalues = sheet.getSheetValues(④)*100;

 var dau = dauvalues.toFixed(⑤)
 var daybefore = daybeforevalues.toFixed(⑤)

 if (  daybefore > 0 ){
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsup: ՞ਊ ՞):thumbsup:");  
 }else{
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsdown: ՞ਊ ՞):thumbsdown:");  
 }
}
```


細かく確認していきます！

## 1.Google Apps ScriptでSlackのチャネルに投稿するのに必要な作業
## Slackへの投稿に必要な用意：
まず、Google Apps Scriptのエディターを開いたら、このライブラリをダウンロードしてください！
非常に便利ですので、このSlackkAppを作ってくださった方は、僕にとって神様です。

- Google Apps ScriptのライブラリSlackApp(Library Key:M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO)

参考：[Slack BotをGASでいい感じで書くためのライブラリを作った](http://qiita.com/soundTricker/items/43267609a870fc9c7453)

さて、ダウンロードがすんだところで、共通部分のポイントをお伝えします！

```js:コード.gs
// 共通部分
var slack = {
  postUrl: 'https://slack.com/api/chat.postMessage',
  token: '①', // Slackのtoken
  channelId: "②", // SlakckのチャネルのID
  userName: "お好きな名前で！！", // botの名前
}

var postMessage = function(text) {
  UrlFetchApp.fetch(slack["postUrl"], {
    "method" : "post",
    "payload" : {
      token: slack["token"],
      channel: slack["channelId"],
      username: slack["userName"],
      text: text
    }
  });
}
```

__ポイントは2つです！！__

まず、1つ目は、こちら

```
token: '①', // Slackのtoken
```
Slackのtokenは、[Slack Web API](https://api.slack.com/web)のAuthenticationでTeam,Userを確認して、ボタンを押すと発行されます。
僕のtokenは`xoxp-○○○○○○○○○-○○○○○-○○○`こんな感じでした！
この`xoxp-○○○○○○○○○-○○○○○-○○○`をコピペすればオッケーです。


次に、2つ目は、こちら

```
channelId: "②", // SlakckのチャネルのID
```

SlackのチャネルIDの取得方法は、
まず[channels.list](https://api.slack.com/methods/channels.list)の上部にあるTesterをクリックし、tokenを確認して、`Test Method`を押します。
次に、`Test Method`の下部にばぁ〜とでてきた文章の中から、自分が投稿したいチャネルの名前(name)を見つけ、その1つ上にあるidをコピーすればオッケーです！
僕が投稿したチャネルIDは英数字を含む文字列でした。
※注意点としては、チャネル名(#generalなど)ではないということです！


これで、共通部分の説明は完了しました！


## 2.スプレッドシートから値(DAUと前日比)を取得し、投稿メッセージを作成するのに必要な作業
次に、数値元によって適宜変更していただく必要がある箇所です。
※今回の注意点としては、スクリプトエディターは、KPI管理を行っているスプレッドシートから開いています。


#### 数字管理の状況説明
[Player!](https://itunes.apple.com/jp/app/id897872395)のDAUと前日比は、Googleスプレッドシートの1つのシートの、ある特定のセルに%表示されています。

dailyスプレッドシートのDAUシートの、3行目の2列目がDAU、3行目の3列目が前日比という感じです。
イメージ図

| day | DAU | 前日比 |
|-----|-----|-----|
| 2015/6/26 | ○○.○○% | +○○.○○%|



そこで、(2.1)特定のスプレッドシートの特定のセルから値を取得して、(2.2)その値を使って投稿メッセージを作成をします。



### 2.1 特定のスプレッドシートの特定のセルから値を取得

```
function myFunction() {
 var ss = SpreadsheetApp.getActiveSpreadsheet();
 var sheet = ss.getSheets()[③];
```

この部分で、スクリプトエディターを開いたスプレッドシートを指定して、DAUを管理しているシートを指定しています。

そして、DAUを管理しているスプレッドシートが一番左から何番目にあるかを数えます。
1番左なら、`ss.getSheets()[0];`
左から4番目なら、`ss.getSheets()[3];`
と対象の数字を`③`に記入すれば、引っ張りたいシートを指定できます。


```
 var dauvalues = sheet.getSheetValues(④)*100;
 var daybeforevalues = sheet.getSheetValues(④)*100;
```

特定のセルを指定して、その値(DAUと前日比)を取得をした後、ちょっとこざいくしてます。
[Player!](https://itunes.apple.com/jp/app/id897872395)の場合、DAUは特定のセルに表示されますので、
`getSheetValues(3,2,1,1)`といったように指定してます。
④の箇所の書き方は、このドキュメントを参考にしてください：https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getSheetValues(Integer,Integer,Integer,Integer)


また、なぜ`*100`があるかというと、`sheet.getSheetValues(④)`の取得したDAU及び前日比の値が`0.○○○○○○○○○○○○○○`となっており、Slackへの投稿メッセージを` ○○.○○% `とするのに必要という理由です。



```
 var dau = dauvalues.toFixed(⑤)
 var daybefore = daybeforevalues.toFixed(⑤)
```

先ほど取得し、こざいくをした値は`○○.○○○○○○○○○○○○○○`となっているので、小数桁を制限するために`toFixed(⑤)`をしています。
小数2桁:`toFixed(2)`
小数5桁:`toFixed(5)`
となりますので、目的の小数桁を`⑤`に記載してください。


これらの作業により、DAUと前日比の取得、加工が完了しました。

### 2.2 取得した値を使って投稿メッセージを作成
```
 if (  daybefore > 0 ){
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsup: ՞ਊ ՞):thumbsup:");  
 }else{
 postMessage("本日のDAUは" + dau + "%で、前日比" + daybefore + "%なんですわ(:thumbsdown: ՞ਊ ՞):thumbsdown:");  
 }
}
```




ここでは、前日比がプラスの場合、マイナスの場合とでメッセージの出し訳を行なっております。

### 自動投稿のための時間設定
[Player!](https://itunes.apple.com/jp/app/id897872395)の場合、これを毎日10時に自動投稿しています。
この時間の設定は、スクリプトエディターの`リリース`の`トリガー`で管理しています！

こうして無事、自動投稿が完成です！
![スクリーンショット 2015-06-26 21.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/58836/28c823be-c52c-a90f-6c31-28974a10271a.png)