Slack チャンネル招待自動化

# 背景
現在所属している会社ではチャットツールとしてSlackを利用しているのですが、アルバイトは招待されたチャンネルしか閲覧出来ない（マルチチャンネルゲスト）ので、その都度依頼がきてチャンネルに招待する作業が発生しています。
一度の作業にそこまで時間はかからないのですが、日に何件も来るので自動化して作業負荷を減らそうと考えました。

# 構成
<img width="795" alt="スクリーンショット 2019-02-28 12.04.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/146554/544d7b10-f174-716d-3ad8-29ba5c82e460.png">

# 設定手順
## Googleformの設定
1. Googleformにて新規のフォームを作成します。
2. 質問は2つで記述式テキスト（必須項目）に設定します。※カンマ（,）で複数回答を配列に変換するので説明を入れてください
3. 設定にて[メールアドレスを収集する]と［信頼できるドメインのユーザーに限定する］にチェックを入れます。
4. 右上の︙をクリックし、［スクリプトエディタ］をクリックします。
<img width="720" alt="スクリーンショット 2019-02-27 10.45.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/146554/4a3557ef-b08f-343d-f623-bb55705bd12a.png">

## Google Apps Scriptの設定
### スクリプト全体
```Javascript
function onFormSubmit() {
  var form = {};
  var formResponses = {};
  var slack_team = "<SLACK_TEAM>";　// ワークスペース名を格納する
  var slack_token = "<SLACK_TOKEN>"; // 発行したSlack Tokenを格納する
  var form_app_id = "<FORM_ID>"; // フォームIDを格納する
  var form = FormApp.openById(form_app_id);
  var formResponses = form.getResponses();
  var formResponse = formResponses[Number(formResponses.length - 1)];
  var itemResponses = formResponse.getItemResponses();
  var Invitees = formResponse.getRespondentEmail();
  var itemResponse1 = itemResponses[0];
  var itemResponse2 = itemResponses[1];
  var channelName = itemResponse1.getResponse();
  var address = itemResponse2.getResponse();
  var ary1 = address.split(',');
  var ary2 = channelName.split(',');
  var url1 = "https://slack.com/api/channels.list?token=" + slack_token;
  var url2 = "https://slack.com/api/users.list?token=" + slack_token;
  var channelList = UrlFetchApp.fetch(url1);
  var userList = UrlFetchApp.fetch(url2);
  var json1 = JSON.parse(userList.getContentText());
  var json2 = JSON.parse(channelList.getContentText());
  var user_id = [];
  var channel_id = [];
   
  for(var i = 0; i < ary1.length; i++){
    for (var row1 in json1["members"]) {
      if (json1["members"][row1]["profile"]["email"] === ary1[i]){
        user_id[i] = json1["members"][row1]["id"];
      }
    }
  }
   
  for(var i = 0; i < ary2.length; i++){
    for (var row2 in json2["channels"]) {
      if (json2["channels"][row2]["name"] === ary2[i]){
        channel_id[i] = json2["channels"][row2]["id"];
      }
    }
  }
   
  for(var i = 0; i < user_id.length; i++){
    for (var h = 0; h < channel_id.length; h++){
      var response = UrlFetchApp.fetch("https://slack.com/api/channels.invite?token=" + slack_token + "&channel=" + channel_id[h] + "&user=" + user_id[i]);
    }
  }
   
  var postUrl = '<Webhook URL>'; // 発行したWebhook URLを格納する
  var username = 'Slack招待フォーム';
  var icon = ':googleform:';
  var body　=　Invitees + " invited " + ary1 + " to " + ary2 + " from Google Form."
  var jsonData =
    {
     "username" : username,
     "icon_emoji": icon,
     "text" : body
    };
  var payload = JSON.stringify(jsonData);
  var options =
    {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
    };
  UrlFetchApp.fetch(postUrl, options);
}
```
変更が必要な部分は以下の3つになります。

#### Slack TOKEN
Slack APIを利用するために必要になります。
以下にアクセスしてTOKENを作成します。
[api.slack](https://api.slack.com/apps)

#### フォームID
GoogleformのIDでURLから抜粋します。

```
https://docs.google.com/forms/d/{フォルダID}/edit
```
上記の{フォルダID}の部分がIDになります。

#### WebhookのURL
設定内容をSlackに投稿するために必要になります。
取得手順は以下の方の記事がわかりやすいです。

[SlackのWebhook URL取得手順](https://qiita.com/vmmhypervisor/items/18c99624a84df8b31008)

## トリガー設定
スクリプトが出来たらトリガー設定することで様々なタイミングで自動的に実行することができます。今回はフォームに投稿されたタイミングで実行するように設定します。

1. スクリプトエディター画面にて［編集］→［現在のプロジェクトのトリガー］をクリックします。
2. 右下にある［トリガーを追加］をクリックします。
3. 以下の通りに設定し、［保存］をクリックします。


実行する関数を選択：onFormSubmit
実行するデプロイを選択：Head
イベントのソースを選択：フォームから
イベントの種類を選択：フォーム送信時
エラー通知設定：今すぐ通知を受け取る
<img width="668" alt="スクリーンショット 2019-02-27 14.31.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/146554/ddb18745-4866-2c34-d41a-0fe2129e6775.png">

トリガー設定まで終わると、フォームの回答が送信されたタイミングでチャンネル招待が実行されます。

# おわりに
このフォームを作成することにより、招待の手間が省け格段に楽になります。
普段はコードを書いたりしないので、コードが汚いと思いますがご容赦ください。

本エントリが、チャンネル招待作業に困っている方々の何かしらの助けになれば幸いです。