Slack上のメッセージをGoogleAppsScriptで受け取ってよしなに使う

最近GoogleAppsScript（以下GAS）でスクリプトを作ることが多いのですが、実行結果をSlackに送るだけではなく、Slackからも値を送って処理を行いたいことが多いのでやり方を調べました。

## TL;DR
- GASでPOSTリクエストを受け取る
- SlackでOutgoing WebHookの設定を行う
- GASでSlackから渡された値を参照する

## GASでPOSTリクエストを受け取る

まずGASでPOSTリクエストを受け取れるようにするため、doPost関数を実装します。とりあえずリクエストを受け取ったら定型文をSlackに渡すようにしましょう。

投稿にはSlackAppライブラリ (`M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO`) を使わせて頂いてます。
参照：http://qiita.com/soundTricker/items/43267609a870fc9c7453

トークン、チャンネルIDについては自身の環境のものを使ってください。


```js
function doPost(e) {
  var slackApp = SlackApp.create(トークン); 
  slackApp.chatPostMessage(チャンネルID, "It's test!!", {
    username : "GAS"
  });
}
```

そしてメニューの「公開」から**Webアプリケーションとして導入**を選択します。

![スクリーンショット_2015-09-01_4_02_45.png](https://qiita-image-store.s3.amazonaws.com/0/18007/9535da5f-84e9-0b93-70c1-cb09e8a260d2.png)

注意点としてSlackからのOutgoing WebHookを受け取るため、アプリケーションにアクセスできるユーザーを**全員（匿名ユーザーを含む）にしておきましょう。

![スクリーンショット_2015-09-01_4_06_32.png](https://qiita-image-store.s3.amazonaws.com/0/18007/889e1e84-15b8-f1b0-bd25-9794b57a682d.png)

するとWebアプリケーションのURLが発行されます。

![スクリーンショット_2015-09-01_3_50_14.png](https://qiita-image-store.s3.amazonaws.com/0/18007/7c02f249-3418-6002-8957-c186179fb18e.png)

URLが発行されたら早速curlでPOSTリクエストを送ってみましょう。
以下のコマンドを実行すると**"スクリプトが完了しましたが、何も返されませんでした"**という内容が書かれたHTMLが返ってきますが、slackにはメッセージが投稿されると思います。

```shell-session
curl -X POST -d "" https://script.google.com/macros/s/ここには自分が作ったGASウェブアプリケーションの一意な値/exec
```

![スクリーンショット 2015-09-01 5.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/18007/4ade22b4-1324-816b-a439-8985aa8808cf.png)


これでGASの準備はひとまず完了です。

## SlackでOutgoing WebHookの設定を行う

次はSlack側でOutgoing WebHookの設定をします。

**Integrations**からOutgoing WebHooksを選び、**Add Outgoing WebHooks**をクリックします。

そして以下の画面でOutgoing WebHookが動くチャンネルを選びます。Anyだと全てのchannel、それ以外だと該当するチャンネルのみで起動します。Trigger Word(s)は発言の最初にその文字列がある場合にOutgoing WebHookが動くという設定です。

![スクリーンショット_2015-09-01_4_23_42.png](https://qiita-image-store.s3.amazonaws.com/0/18007/eaf159d3-c68f-2820-ab9d-c628798f9ec1.png)

この設定を保存した上で、チャンネル上でTrigger Wordを打ってみましょう。

![スクリーンショット 2015-09-01 5.43.32.png](https://qiita-image-store.s3.amazonaws.com/0/18007/33afe155-d032-e3d3-ae15-02d0aec88ac7.png)

これでSlack上からGASにアクセス出来るようになりました。

## GASでSlackから渡された値を参照する

最後にGAS内でSlackから送られた値を参照する方法です。

まずこのままでは他人にWebアプリケーションのURLを知られてしまうとbotに発言させまくるイタズラが出来てしまうので、先ほどのOutgoing WebHookの設定画面にあったTokenを使用して以下の様な対応をしておきましょう。

```js
if (VERIFY_TOKEN != e.parameter.token) {
    throw new Error("invalid token.");
}
```

上記のtokenのように、Slackから送られてきたメッセージ内容やユーザ名は、GASでは`doPost()`の引数`e`が持つ`parameter`プロパティから取得できます。よって以下の様なコードを書くと、スクリーンショットのようなレスポンスになります。

```js
function doPost(e) {
  if (VERIFY_TOKEN != e.parameter.token) {
    throw new Error("invalid token.");
  }

  var message = "テストでし " + e.parameter.user_name + "\n";
  message += "復唱でし「" + e.parameter.text + "」";

  var slackApp = SlackApp.create(トークン); 
  slackApp.chatPostMessage(e.parameter.channel_id, message, {
    username : "GASBot",
    icon_emoji : ":desshi:" 
  });
}
```

![スクリーンショット 2015-09-01 6.04.52.png](https://qiita-image-store.s3.amazonaws.com/0/18007/7474e4cb-6175-bbe2-91c9-fbbae81a17cb.png)

GoogleAppsScript楽しい！
✌('ω'✌ )三✌('ω')✌三( ✌'ω')✌

## ref:
- [Outgoing Webhooks | Slack](https://api.slack.com/outgoing-webhooks)
- [GoogleAppsScript - Slack BotをGASでいい感じで書くためのライブラリを作った - Qiita](http://qiita.com/soundTricker/items/43267609a870fc9c7453)