GASからSlack APIを叩く方法（非管理者向け）

# 背景

- Slack APIを使用したい。
- **GAS** (Google Apps Script)上で使用したい。
- Slack APIを使用するには**アプリ作成によりトークン発行**が必要。
- 自分はそのSlackワークスペースの**管理者ではない**。
- 参加しているワークスペースでは、アプリのインストールに**管理者承認**が必要。

Slack APIの使い方については仕様変更があったようです。
（2018～2020年頃のどこかで？）

古い情報（レガシートークン・テストトークン使う方法）は使えないので、現時点での使用手順を整理しました。

ちなみに上記の通り、使用するslack ワークスペースは**自分が管理者ではない**ケースを想定しています。



### 注意点
- Slackの**無料プラン**では、使用できるアプリは**10個まで**です。
- アプリのインストールに管理者の**承認が必要な場合**があります。（管理者の設定次第）
- 管理者の使用承認がおりるか**確認した上で着手**されるのが良いと思います。

# 作業概要

1. 事前確認
1. アプリを新規作成
1. 使用する権限を選択
1. 管理者へ使用承認を申請
1. （承認後）アプリをインストールしてトークンを取得
1. GASでAPIを叩く

今回GASでは、チャンネルID一覧を取得するコードのみ記述します。


# 作業手順

## 事前確認

### ワークスペースにインストール済みのアプリを確認
1. slackのワークスペース画面、左下の「アプリを追加する」をクリック

    <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/16fdda8b-ec98-f7cb-4148-58d56f22ece0.png">

1. アプリ数を確認
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/b180bc5c-21e2-308d-c78b-0bdcdc4393d8.png">

※ 既に非推奨となっている「カスタムインテグレーション」もアプリ数にカウントされるようです。


### 管理者へ確認

Slackのワークスペースの管理者へ「アプリを作成・インストールしたい」ことを伝えて承認を貰っておきましょう。

## アプリを新規作成

1. [Slack API](https://api.slack.com/apps)を開き、「Create New App」をクリック。

    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/3cbff979-3b0a-db53-a68f-fee633001fd4.png">

1. From scratchをクリック。

    <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/8ca5a9ec-77a1-e341-d592-2edbf9c93dc5.png">

1. 任意のApp Nameを入力、対象のワークスペースを選択し、「Create App」をクリック。
    <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/daf58057-90d3-633d-0d3a-dee42fc8b343.png">

## 使用する権限を選択

1. [Web API methods](https://api.slack.com/methods)から必要な権限を調べます。

    ※ Channel IDの取得には「conversations.list」メソッドを使うので、以下のように検索します。
    <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/17138685-f8b2-5a5f-395b-aee39c7934ef.png">
    　　↓
    <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/4a941ecb-ee51-f16b-33dd-f13a31201519.png">






1. 左のメニューから「OAuth & Permissions」をクリック。
    <img width="150" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/eb6b267d-cbef-c32e-b09f-7136b976552d.png">

1. 「Add an OAuth Scope」をクリックし、追加する権限を選択。（複数可）
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/5245d857-e107-1f3a-1b13-fb534a367633.png">

## 管理者へ使用承認を申請

1. 左のメニューから「Install App」をクリックし、「Request to Install」をクリック。
    <img width="450" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/bc3f68f3-d167-3ec9-96e6-5d6680fb065e.png">

    ※ 自分が管理者の場合は、ここでそのままインストールできます。

1. メッセージを入力し「Submit Request」をクリックして申請を送信。
    <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/f17f3ff7-4f73-7503-9e69-487c3abb642a.png">

    ※ 管理者へは「Slackbot」からのDMが届きます。


## （承認後）アプリをインストールしてトークンを取得

1. 承認されるとSlackbotからDMが届きます。

    <img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/f485b9d1-35f5-0340-3beb-2469766e70ac.png">

1. 設定の続きを行うため、1. [Slack API](https://api.slack.com/apps)を開きます。

1. 該当するアプリをクリック。

    <img width="250" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/e6fd73a2-a3d8-226c-ec53-4edcddd09e75.png">

1. 左のメニューから「Install App」をクリックし、「Install to Workspace」をクリック。
    <img width="400" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/e33630c7-40a3-2e69-3000-00ce1511a0a3.png">

1. 権限の確認が表示されるので「許可する」をクリック。

    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/63220cdb-ef2d-fe87-efc0-eb2cf70f84bd.png">


1. トークンが表示されるのでコピーしておく。
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/3239523c-9e65-331e-1101-685dfb0326ff.png">


    <font color="red">※ トークンはセキュリティ対策上、誰かと共有しないで下さい。</font>

## GASでAPIを叩く

### トークンを「プロジェクトのプロパティ」に設定

GASで使うために、トークンを設定します。

セキュリティ上、スクリプトに直接書くのはよろしくないので、「プロジェクトのプロパティ」に設定します。

ただ現在（2021年12月時点）、「新しいエディタ」では本機能を使用できないようなので、「以前のエディタ」に切り替えて登録します。

1. スプレッドシートから「拡張機能」→「Apps Script」をクリック。
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/7b0f7545-f561-1784-470d-44bb329bbcce.png">

1. 画面右端にある「以前のエディタを使用」をクリック。

    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/a0aed520-4715-b7f1-f91c-d4f40037e5d5.png">

1. 旧エディタの表示に変わるので、「ファイル」→「プロジェクトのプロパティ」をクリック。
    <img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/00201dc1-b89b-0c01-c8ab-09184c5e1ef2.png">

1. 「スクリプトのプロパティ」をクリック。

    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/2064b88c-bc0a-311b-4ac1-ac1deb23704e.png">

1. 「行を追加」をクリック。
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/4a150f92-38fe-6584-36f3-f65fbc8ef791.png">

1. 任意のトークン名と先ほどコピーしたトークンを入力します。
    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/e8269471-1852-6fe6-aebd-7f070c891f42.png">
    ※ 入力欄は最初見えませんが、クリックすると出現します。

1. 登録した値は、以下のようにスクリプト内で利用できます。

    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/57870d23-8059-fc90-51e6-61410c99b2aa.png">

    ``` .js
    var ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("XXXXX_TOKEN");
```

1. （任意）プロジェクトのプロパティを登録したら新しいエディタに戻しておきます。

    <img width="350" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/7c713435-b3ea-3c25-3023-0e75da99469d.png">



### Channel IDの取得

以下の関数で取得できます。
新しくスクリプトを作成する方は、元から入っているコードを消して上書きすれば大丈夫です。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2449468/29484139-6ac8-d183-f571-cda55f20bdc5.png">

``` getChannelId.js
// 登録したプロジェクトのプロパティから、アクセストークンを取得
var ACCESS_TOKEN = PropertiesService.getScriptProperties().getProperty("XXXXX_TOKEN");

// チャンネルIDを取得する関数
function getChannelId() {
  var target_channel_name = 'IDを取得したいチャンネル名';
  var headers = {
    'Authorization': 'Bearer '+ ACCESS_TOKEN
  };
  var options = {
    'method' : 'post',
    'headers': headers,
    'contentType': 'application/json',
  };

  // 全てのチャンネル情報を取得
  var response = UrlFetchApp.fetch('https://slack.com/api/conversations.list', options);
  var json = JSON.parse(response.getContentText());

  // 対象のチャンネルのIDのみ表示する
  for (i=0; i<json.channels.length; i++) {
    if (json.channels[i].name == target_channel_name) {
      // ここで行いたい処理をする。今回はログに表示するにとどめています。
      Logger.log("Channel ID: " + json.channels[i].id);
    }
  }
}
```

# さらに発展して

[Web API methods](https://api.slack.com/methods)から欲しい情報の取り方を調べ、GAS上で処理することで様々なことができるはずです。
Slack以外のAPIも組み合わせれば、アプリ間の連携も可能です。