公開Slack用 自動招待フォーム by GAS

Slackっていけてますよね。閉じた環境で使ってる分には良いんだけど
Publicなチームを作ろうとした際に問題なのが招待問題。

メアド縛りができるのでgmail.comを許可できればいいのですが
なぜかドメインでgmail.comが指定できないため、個別招待をするしか無いです。

node.js使ったり、hubot使ったりしてAPI叩く自動招待の仕組みがありますが
何がしかサーバを用意しなくちゃいけないのがめんどくさいですよね。
そこで、GASを使いましょう。GoogleAppsではFormがはじめから用意されているので
フォームが投稿されたらSlack API叩いて招待するのをGASで組めます。

#Step1 Slackのトークン取得

URL : https://api.slack.com/custom-integrations/legacy-tokens
上記URLに、当該チームにアクセスできるアカウントでアクセスします。

![Slack_Web_API___Slack.png](https://qiita-image-store.s3.amazonaws.com/0/4036/a5282007-0bf9-7488-37a3-8f832be340ab.png "Slack_Web_API___Slack.png")

# Step2 GoogleDriveで新規のフォーム作成

![HandsOn_-_Google_ドライブ.png](https://qiita-image-store.s3.amazonaws.com/0/4036/e192c9c3-039d-a52e-36d3-eaf959238d21.png "HandsOn_-_Google_ドライブ.png")

フォームが作成できたら、URLからIDを取得します。
![無題のフォーム_-_Google_フォーム_と_GAS_Station_-_Google_ドライブ.png](https://qiita-image-store.s3.amazonaws.com/0/4036/9b375044-e3bd-f445-9920-1cafaedcf27a.png "無題のフォーム_-_Google_フォーム_と_GAS_Station_-_Google_ドライブ.png")

上記例の場合は、 `1YOkv3BRafIMq3bKKyS3QwA6Rxd4s27GUnPJ1cqM7xWk` になります。

Slackに招待するためのアカウント（メールアドレス）を記入してもらうフォームを作成しておきます。
![無題のフォーム_-_Google_フォーム.png](https://qiita-image-store.s3.amazonaws.com/0/4036/1d35dbff-602d-584b-d583-ab78c65874bd.png "無題のフォーム_-_Google_フォーム.png")


# 準備出来たもの

Slackのチーム名（サブドメイン名）
Slackのトークン
GoogleフォームのID



## Google Apps Script仕込み

これらを下記GASの冒頭の変数にそれぞれ埋め込んで、フォームにGASを追加します。

```slack_inv.gs

var slack_team = "<YOUR_SLACK_TEAM>"
var slack_token = "<YOUR_SLACK_TOKEN>"

var form_app_id = "<YOUR_FORM_ID>"

function form_submit(){
  var form = FormApp.openById( form_app_id );
  var formResponses = form.getResponses();
  for (var i = 0; i < formResponses.length; i++) {
    var formResponse = formResponses[i];
    var itemResponses = formResponse.getItemResponses();
    for (var j = 0; j < itemResponses.length; j++) {
      var itemResponse = itemResponses[j];
      slack_api(itemResponse.getResponse());
      Logger.log('Response #%s to the question "%s" was "%s"',
                 (i + 1).toString(),
                 itemResponse.getItem().getTitle(),
                 itemResponse.getResponse());
    }
  } 
}


function slack_api(inv_addr){
　　　　inv_addr = encodeURIComponent(inv_addr);
  var url = "https://"+ slack_team +".slack.com/api/users.admin.invite";
  var query = "email="+encodeURIComponent(inv_addr)+"&token="+slack_token+"&set_active=true";
  
  var parameters = {
    method : "post",
    payload : query
  };
  var response = UrlFetchApp.fetch(url,parameters);
  Logger.log(response.getContentText());
}

```

# Step3 フォームにスクリプトの追加


## スクリプトの新規作成

###グーグルフォームの編集画面で、メニューから ツール＞スクリプトエディタを選択すると、新規スクリプトが生成されます。
![無題のフォーム_-_Google_フォーム.png](https://qiita-image-store.s3.amazonaws.com/0/4036/0ba8b40b-b10e-6361-111f-7eae26d871fe.png "無題のフォーム_-_Google_フォーム.png")


### ダイアログで、空のプロジェクトを選択

![無題のプロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/4036/49af1edb-8592-ae63-116b-e480f35f8166.png "無題のプロジェクト.png")


全ステップのスクリプト内容をコピペし、下準備したチーム名、トークン、フォームIDを書き換えます。
書き換え終わったら、保存しましょう。 メニューのファイル＞保存 
適当な名前で保存して結構です。

# Step4 トリガーの設定

実際にフォームでメールアドレスが投稿された際に実行したいので、トリガーを設定します。
スクリプトエディター内のメニューから リソース＞現在のプロジェクトのトリガー　を選択します。
![無題のプロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/4036/ec93163f-97c5-c154-df0a-4a168df73b98.png "無題のプロジェクト.png")

まだトリガーが存在してないはずです。今スグ追加をクリックします。
![無題のプロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/4036/1e8667bd-176c-9767-240d-443ebe4de326.png "無題のプロジェクト.png")

実行：form_submit
イベント： フォームから
			フォーム送信時
を選択して保存します。


![無題のプロジェクト.png](https://qiita-image-store.s3.amazonaws.com/0/4036/511906e1-b79b-d65b-e7d9-2cf07aa6a83f.png "無題のプロジェクト.png")


# 完成
以上で、フォームにメアドが投稿されるたびに自動でそのメールアドレスをSlackの招待リストに追加し
Slackから招待メールが送信されるようになりました。

チウイ：招待APIは非公開との情報もありいつまでこのAPIが使えるかわかりません。

# join gasja.slack.com !

Google Apps Scriptの情報交換を行うSlackを作りました。
https://gasja.slack.com です。参加は http://goo.gl/forms/lkxl34CsSG より行えます。

![Join_gasja_slack_com.png](https://qiita-image-store.s3.amazonaws.com/0/4036/e605f640-3f29-caa7-246a-0a85bdd7219a.png "Join_gasja_slack_com.png")