Gather.townで定期的にスペースにいる人数をSlack通知するGASを作る方法

## 実現すること

GASを用いて、定期的にGather.townのスペースにいるアクティブユーザーを取得し、Slackの特定チャンネルに通知する。

## 事前準備 - SlackAPIの設定/GatherApiKey

### 全体の流れ

1. ManifestからSlackAppを作成する
2. `Settings > Install App > Install To Workspace`でワークスペースにインストールする
3. `Settings > Install App > Bot User OAuth Token`をメモしておく
4. [ここ](https://app.gather.town/apikeys)からGatherのApiKeyを取得する

### ManifestからSlackAppを作成する

#### Manifest

```json
{
    "display_information": {
        "name": "Gather通知アプリ",
        "description": "毎日Gather.townにいるアクティブユーザーを通知します。",
        "background_color": "#1f1f1f"
    },
    "features": {
        "bot_user": {
            "display_name": "GatherNotification",
            "always_online": false
        }
    },
    "oauth_config": {
        "scopes": {
            "bot": [
                "chat:write"
            ]
        }
    },
    "settings": {
        "org_deploy_enabled": false,
        "socket_mode_enabled": false,
        "token_rotation_enabled": false
    }
}
```

#### 対象ワークスペースを選ぶ

![CleanShot 2023-03-17 at 21.10.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/539fccba-7d8b-fd76-47eb-de23d0b6f2c5.png)

#### manifestをコピペ

![CleanShot 2023-03-17 at 21.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/050bdca8-1083-0181-46ec-e732529a4a39.png)

#### Createする

![CleanShot 2023-03-17 at 21.10.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/19a7b02b-4a9a-6100-1bfc-1fcb4cf8b0b2.png)

### ワークスペースにインストールする

![CleanShot 2023-03-17 at 21.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/7ef36def-831b-506d-b04d-3ec56e65ca53.png)

### SlackBotTokenを取得する

![CleanShot 2023-03-17 at 21.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/5306f796-3d44-0b95-a894-b72317ae5406.png)

### Gather.townのApiKeyを取得する

https://app.gather.town/apikeys

こちらのリンクからGatherにログインしたことがあるのであれば、ApiKeyを取得することができます。

## 実装

### GAS準備

1. `ライブラリ > スクリプトID`に以下を入力
	1. `1on93YOYfSmV92R5q59NpKmsyWIQD8qnoLYk-gkQBI92C58SPyA2x1-bq`
2. 検索を押下
3. IDは`SlackApp`のまま、追加を押下

#### ライブラリをメニューから選択

![CleanShot 2023-03-17 at 21.15.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/b96f269a-df36-a8d5-b9aa-90b3891ea78c.png)

#### スクリプトIDを入力し、ライブラリを読み込む

![CleanShot 2023-03-17 at 21.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/5e54f602-09e4-90b6-621a-1b90fa126a2d.png)

#### 追加

![CleanShot 2023-03-17 at 21.16.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/438bbde9-54ee-c0b5-931d-5e9dc80073c2.png)

### GASのコード全体

ソースコードは単純に現在接続数の数を返すだけになっています。ここに人数によって、フレーバーテキストを変えたり、GatherのスペースURLを貼るなどして工夫してみましょう！

```javascript
function main() {
  const activeUserNow = getActiveUserCount();
  const channelId = PropertiesService.getScriptProperties().getProperty("slackChannelId");
  sendSlack(channelId, activeUserNow);
}

function getActiveUserCount() {
  // APIからスペース情報を取得
  const url = "https://api.gather.town/api/v2/users/me/owned-spaces";
  const headers = {
    "apiKey": PropertiesService.getScriptProperties().getProperty("API_KEY")
  };
  const response = UrlFetchApp.fetch(url, {
    "headers": headers
  });
  const data = JSON.parse(response.getContentText());

  // スペースIDを指定
  const spaceId = 'スペースID' // console.log(data)をして出てきたお目当てのスペースIDをコピペするのがオススメ
  // スペースの人数を取得
  const workSpace = data[spaceId]
  const activeUserCount = workSpace['numActive'];
  return activeUserCount;
}

function sendSlack(channel, message) {
  const slackToken = PropertiesService.getScriptProperties().getProperty('slackBotToken');
  const slackApp = SlackApp.create(slackToken);
  slackApp.postMessage(channel, String(message));
}
```

### スクリプトプロパティの設定

Apps Scriptの`プロジェクトの設定`からスクリプトプロパティを設定します。

![CleanShot 2023-03-17 at 21.34.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/290405d4-206a-95c9-44c8-74fefe1cca1c.png)

スクリプトプロパティを設定します。

- `API_KEY`
	- GatherのApiKey
- `slackBotToken`
	- OAuth Bot User Tokenのもの
- `slackChannelId`
	- Slackのチャンネル設定の一番下にあるところから取得することができます

![CleanShot 2023-03-17 at 21.37.35 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/afa545fc-6f91-28cc-8636-5e7a39ed5d3e.png)

![CleanShot 2023-03-17 at 21.34.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/f54e51d2-2648-efce-5c61-532d53fa50f2.png)

### アプリを対象チャンネルに追加する

作成したアプリを`slackChannelId`で指定したチャンネルに追加してあげてください！

![CleanShot 2023-03-17 at 22.12.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/2ae6e71a-5643-5768-c2a6-518ba021f2f6.png)

![CleanShot 2023-03-17 at 22.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/42d4b261-4a5f-7f1f-441f-532d97f6efec.png)


### 動作確認

色々権限を与える必要があるので、流れに沿って権限付与してあげてください！

### 日時実行設定

毎日お昼ごろに通知してほしいのでトリガーを設定します。

![CleanShot 2023-03-17 at 21.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/32bedaf6-13bf-2e41-2c4b-0de2cc27a82b.png)

![CleanShot 2023-03-17 at 21.32.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239325/babc60dc-c1d1-3037-1b7b-18337c73383e.png)

## おわりに

Gather.townをより便利に使うことで、リモートワーク下でもコミュニケーションハブを作ることができます。GatherのようにバーチャルオフィスツールはDiscordやGoogle Meetとは異なり、楽しく、アバターを通して「そこにいる」ような感覚を実現することができます。

今回は手順に従うだけで簡単にできるように意識して書きました。ぜひ使ってみてください。

## 参考記事

https://zenn.dev/ryo_endo/articles/a1cd54399383c0

https://qiita.com/keitonanba/items/75fe195336d92e8adecb