【GAS】SlackからOutgoingでパラメーターをGASに送って処理結果をIncomingで受け取って表示する

　いま、スプレッドシートで作った何らかのシフト表があって、Slack上のtempという名前のチャンネルで「shukkin:山田;明日」などと打つと「13:00~17:00」とか「お休み」といった感じで返って来るようにしたいと思います。

#スプレッドシートの概要

　シフト表はシート1にあり、とりあえずこのような感じになっているとします。


![スクリーンショット 2016-11-03 18.35.45.png](https://qiita-image-store.s3.amazonaws.com/0/139134/a8988496-2cae-8f63-a5ae-6391338bcc83.png)

　そしてシート2の方で検索結果となるセル番地情報を出します。具体的にはあとで出てきますがSlackから今日の日付、それにプラスする値、名前を受け取ってそれぞれA2、A3、B2に代入し、A5、B3にある数式が結果を返すような感じです。A5はA4と合致するシート1の行番号、B3はB2と合致するシート1の列番号を意味します。

　シート2を作らないでJavaScriptのみで取得するやり方（配列を取ってきて照合して・・）もありますが、日付処理のあたりがけっこうややこしいので今回はシートを使うことにしています。

![スクリーンショット 2016-11-04 0.07.11.png](https://qiita-image-store.s3.amazonaws.com/0/139134/7d5a3de1-4c25-1ee8-be3c-679f1066b46f.png)


```
式の中身
A4→=IFERROR(A2+A3,)
A5→=IFERROR(MATCH(A4,'シート1'!A:A,0),)
B3→=IFERROR(MATCH(B2,'シート1'!1:1,0),)
```

　今日が11月3日だとして、山田さんの明日の予定を示すシート1のセル番地は(5,3)で、結果は13:00~17:00というわけです。


#Slack側の設定
　Outgoing WebHooks設定画面へいき、Channelは#tempを選択し、Trigger Word(s)はshukkin:とし、URL(s)は後ほどGASコードを書いたあとに取得したものをコピペします。TokenはGASコードのなかで使います（必須ではありませんが）。
　
　また、Incoming WebHooks設定画面へいき、Webhook URLを予め取得しておきます。

#GAS側のコード

　独立したスクリプトファイルを立ち上げて（スプレッドシート付属のものではなく）、下記のように記述します。

```js:コード.gs
function doPost(e) {

  // トークンが不一致なら処理終了
  var token = e.parameter.token;
  if (token != "取得したトークン") {
    return;
  }

  // パラメーターを取得
  var text = e.parameter.text;

  // 最初のshukkin:は余分なので削除
  text = text.substring(8)

  // スプレッドシートから対象となるデータを取得

  // 対象となるスプレッドシート、シートの情報を設定
  // スプレッドシートキーはスプレッドシート画面のURL欄からコピペ
  var ss = SpreadsheetApp.openById("スプレッドシートキー");
  var sh1 = ss.getSheetByName("シート1");
  var sh2 = ss.getSheetByName("シート2");

  // パラメーターから名前と今日or明日or明後日を分割
  var ary = text.split(";");
  var name = ary[0];
  var when = ary[1];

  // 今日の日付にプラスする数字を取得
  if (when == "今日") {
    var i = 0;
  } else if (when == "明日") {
    var i = 1;
  } else if (when == "明後日") {
    var i = 2;
  }

  // 今日の日付を取得
  var today = new Date();
  today = Utilities.formatDate(today,"GMT+0900","MM/dd");

  // 今日の日付、プラスする値、名前をシートにセットする
  sh2.getRange(2,1).setValue(today);
  sh2.getRange(3,1).setValue(i);
  sh2.getRange(2,2).setValue(name);

  // 日付に一致する行番号を取得
  var row = sh2.getRange(5,1).getValue();

  // 名前に一致する列番号を取得
  var col = sh2.getRange(3,2).getValue();

  // 結果を取得
  var message = sh1.getRange(row, col).getValue();
  if (!message) message = "お休みです";
  
  // レスポンスを返す
  sendResponse(message);
}

/*****************/
/* レスポンスを返す */
/*****************/

function sendResponse(message) {
  var payload = {
  "text" : message,
  "channel" : "#temp",
  "username" : "my秘書",
  "icon_emoji" : ":information_desk_person:"
  }
  var options = {
    "method" : "POST",
    "payload" : JSON.stringify(payload)
  }
  var url = "https://hooks.slack.com/services/取得したWebhookURL";
  var response = UrlFetchApp.fetch(url, options);
  var content = response.getContentText("UTF-8");
}

```


#GAS側の設定

　コードを書き終えたらメニューバーから「公開」→「ウェブアプリケーションとして導入・・・」を選び、設定ダイアログが開いたらバージョンは新規作成、次のユーザーは自分、アクセスユーザーは全員（匿名含む）とします。というのもSlackという匿名ユーザー（グーグルにログインしていないユーザー）がアクセスしてくるのでこの設定にしないと動きません。ちなみにコードを変更したら常にバージョンは新規作成として保存し直さないと変更が反映されないので注意。

　また、この画面で「現在のウェブアプリケーションのURL：」に表示されるURLをコピーしておき、さきほどのSlack側の設定のURL(s)にコピペしておきます。SlackがこのURLにアクセスするよーといった感じです。

![スクリーンショット 2016-11-03 20.30.08.png](https://qiita-image-store.s3.amazonaws.com/0/139134/d74bcef3-2042-30b3-9a88-d5208dafaf5e.png)


#動作確認

![スクリーンショット 2016-11-03 21.04.58.png](https://qiita-image-store.s3.amazonaws.com/0/139134/7bb98054-8755-83e4-d848-d01df048dbad.png)

こんな感じで返ってきます。


#参考サイト
http://jd.mares.co/tutorials/2015/09/20/slack-google-apps-script-stand-ups.html

#Outgoingを複数設定したい・・・
　Outgoingは便利ですが複数設定にはいろいろコツがありそうです。それについては機会を改めて自分なりのやり方を紹介したいと思います。