GASを使ってSlackと会話する

GoogleAppsScript(以降GAS)を使ってSlackと会話するアプリケーションを作ってみます。

### 1. 事前準備

- [Incoming Webhooksを使ってSlackチャンネルに投稿してみる](https://qiita.com/yoshirin/items/ef7082c5bd0e67891453)の記事を参考に、会話用のチャンネルを新規作成した上でIncoming Webhooksを使ってSlackチャンネルに投稿できるSlackアプリを作成しておく。

- 「Incoming Webhooks URL」を確認する。

### 2. App Credentialsの取得

- 以下のリンクをクリックする。(ログインしていない場合はログインする)

　　[https://api.slack.com/apps](https://api.slack.com/apps)

- 「Incoming Webhooks」を作成したSlackアプリを開き、Basic Informationにある「Verification Token」を確認する。


### 3. スクリプトの作成

- Google Driveにログインして、「Google Apps Script」ファイルを新規作成する。

　※右クリック→「その他」→「Google Apps Script」より選択できます。(存在しない場合はアプリの追加より追加してください)

- 以下のようなスクリプトを書いて保存する。(プロジェクト名は任意の名称でかまいません)

VERIFICATION_TOKEN変数には「Verification Token」、INCOMING_WEBHOOKS_URL変数には「Incoming Webhooks URL」を設定する。

```
var VERIFICATION_TOKEN = "ここにVerification Tokenを設定する";
var INCOMING_WEBHOOKS_URL = "ここにIncoming Webhooks URLを設定する";

function doPost(e) {
  var returnData = {};
  var jsonString = e.postData.getDataAsString();
  var jsonObj = JSON.parse(jsonString);
  if ('type' in jsonObj) {
    if (VERIFICATION_TOKEN != jsonObj['token'] ) {
      return null;
    }   
    if (jsonObj['type'] == 'event_callback') { 
      if (jsonObj['event']['type'] == "message" || jsonObj['event']['channel_type'] == "channel") {
        var returnText = getReturnText_(jsonObj['event']['text']);
        send_(returnText);
      }
    } else if (jsonObj['type'] == 'url_verification') {
      var challenge = jsonObj['challenge'];
      returnData = {
        "challenge": challenge
      };
    }
  }
  var returnDataString = JSON.stringify(returnData);  
  var returnOutput = ContentService.createTextOutput(returnDataString);
  returnOutput.setMimeType(ContentService.MimeType.JSON);
  return returnOutput;
}

function getReturnText_(text) {  
  if (text == "おは") {
    return "おはようございます";
  } else if (text == "こん") {
    return "こんにちわ";
  } else if (text == "ばん") {
    return "こんばんわ";
  } else if (text == "あなたの職種は") {
    return "エンジニアです";
  }
  return ""; 
}

function send_(text) {
  if (text == "") {
    return;
  }
  var payload = {"text": text};
  var options = {
    "method" : "POST",
    "contentType": "application/json",
    "payload" : JSON.stringify(payload),
    "muteHttpExceptions" : false
  };
  try {
    UrlFetchApp.fetch(INCOMING_WEBHOOKS_URL, options);
  } catch (e) {
  }
}
```

[Channelにメッセージ送信時、GAS側で受け取るJSON]
[https://api.slack.com/events/message.channels](https://api.slack.com/events/message.channels)

- メニューバーの「実行」→「関数を実行」→「doPost」を選択する。

- 「承認が必要です」ダイアログが表示されたら「許可を確認」ボタンをクリックする。

- アカウントの選択で、対象のアカウントを選択し、スコープの許可を行う。

※「このアプリは確認されていません」のダイアログが表示された場合は、「詳細」のリンクをクリックして、「・・・(安全ではないページ)に移動」リンクをクリックする。(自己責任で！)

- 許可ボタンクリック後にスクリプトが実行され、スクリプト実行エラーになりますが問題ありません。

- メニューバーの「ファイル」→「版を管理」をクリックし、版を管理ダイアログを表示する。

- 「新しいバージョンを保存」をクリックし、バージョン１の行が追加されることを確認する。

- メニューバーの「公開」→「ウェブアプリケーションとして導入」をクリックする。

- 「プロジェクトバージョン」には新しい番号のバージョンを、「次のユーザーとしてアプリケーションを実行」には「自分」を、「アプリケーションにアクセスできるユーザー」には「全員(匿名ユーザーを含む)」を選択し、「導入」ボタンをクリックする。

- 「ウェブアプリケーションのURL」が発行されます。

### 4. Event Subscriptionsでの設定

- ブラウザに戻り「Incoming Webhooks」を作成したSlackアプリの設定を開く。

- サイドメニューより「Event Subscriptions」をクリックする。

- 「Enable Events」をONに設定する。

- 「Request URL」に「3. GASを使って会話スクリプトの作成」で生成した「ウェブアプリケ−ションURL」を設定する。

　※Verifiedと表示されれば認証成功

- 「Subscribe to Workspace Events」には、「message.channels」のみを選択する。

- 「Save Change」ボタンをクリックする。

- 画面上部にパーミッション変更に伴うリンクが表示されるので、「click here」をクリックして会話したいチャンネルを選択の上、パーミッションの許可を行う。

### 5. Slackと会話してみる。

- メッセージを送信してみる。

![04_2.png](https://qiita-image-store.s3.amazonaws.com/0/239358/72e56afc-240d-a06f-2e78-5627cfe49325.png)

### 6. 会話スクリプトを変更したい場合

- 工事中(