Google Apps Scriptを使ったGoogle Chat APIのChat.Spaces.Membersのメソッド解説

## はじめに

今回はGoogle Apps Scriptを利用する際の、Google Chat APIのChat.Spaces.Membersリソースの6つのメソッド (create, get, list, patch, remove) の使い方について詳しく解説していきます。

`UrlFetchApp`を利用した記述方法はネットの記事で散見されますが、Google Apps Scriptで利用できるGoogle Chat APIを利用した実装に関する記事があまり見つけられませんでした。

ドキュメント探しなど利用方法を調べるのに苦労したので、これから実装する人の助けに少しでもなれば幸いです。

## 前提条件

Google Chat APIを使うためには、事前にGCPとApps Scriptの紐づけ作業が必要です。下記の作業を行っておいてください。

1. Google Cloud Platform (GCP)でプロジェクトを作成し、Google Chat APIを有効にする
1. OAuth 2.0クライアントIDを作成し、Google Apps Scriptプロジェクトに追加する
1. Google Chat APIをGoogle Apps Scriptで有効にする

[Build a Google Chat app with Google Apps Script  |  Google for Developers](https://developers.google.com/workspace/chat/quickstart/apps-script-app)

上記のサイトを参考に作業を行えば、私の環境では大丈夫でした。
ここまで準備が整ったら以下のコードを使って実際にメソッドを試してみましょう。

## 前準備

まず設定からappsscript.jsonを表示するようにしましょう。
表示出来たらコードエディターから下記のように編集してください。
今回のメソッドに必要な権限を記述しておきます。

```json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {
    "enabledAdvancedServices": [
      {
        "userSymbol": "Chat",
        "version": "v1",
        "serviceId": "chat"
      }
    ]
  },
  "oauthScopes": [
    "https://www.googleapis.com/auth/chat.spaces",
    "https://www.googleapis.com/auth/chat.memberships"
  ],
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8"
}

```

## Chat.Spaces.Membersのメソッド

### get

メンバー情報を取得する場合はgetメソッドを利用します。
引数としては`spaces/${スペース名}/members/${メールアドレス or userId}`としてあげることがポイントです。
`userId` はメールアドレスを指定して `get` してあげれば取得できますが、メールアドレスが分かっていれば、そちらを使う方が良いかと思います。

```javascript
const getMember = (spaceName, email) => {
  try {
    const member = Chat.Spaces.Members.get(`${spaceName}/members/${email}`);
    Logger.log(`Member details: ${member}`);
  } catch (error) {
    Logger.log(`Error getting member: ${error}`);
  }
};

const testGetMember = () => {
  const spaceName = 'spaces/XXXXXXX'; // 置き換えてください
  const email = 'example@example.com'; // 置き換えてください

  getMember(spaceName, email);
};
```

`spaceName`は自分が確認できるスペースであればWeb版のGmailからChatのURLを見れば取得できます。
確認できないスペースであれば、`Chat.Spaces.list`メソッドで取得したレスポンスを確認すると取得できます。

[Get details about a user's or Google Chat app's membership  |  Google for Developers](https://developers.google.com/workspace/chat/get-members)

### list

`list`メソッドも`get`と似たような利用方法で利用できます。
スペース名を指定してあげるとメンバーやBOTの一覧を表示してくれます。

```javascript
const listMembers = (spaceName) => {
  try {
    const response = Chat.Spaces.Members.list(spaceName);
    const members = response.memberships;
    members.forEach(member => {
      Logger.log(`Member: ${member.member.name}`);
    });
  } catch (error) {
    Logger.log(`Error listing members: ${error}`);
  }
};

const testListMembers = () => {
  const spaceName = 'spaces/XXXXXXX'; // 置き換えてください

  listMembers(spaceName);
};

```

[List users and Google Chat apps in a space  |  Google for Developers](https://developers.google.com/workspace/chat/list-members)

### create

スペースに人やBOTを追加するときは`create`メソッドを利用します。
このメソッドが一番苦労しました。
下記のような記述方法で実行できます。

```javascript
const addMember = (spaceName, email) => {
  const memberResource = {
    member: {
      name: `users/${email}`,
      type: 'HUMAN',
    }
  };

  try {
    const response = Chat.Spaces.Members.create(memberResource, spaceName);
    Logger.log(`Member added: ${response}`);
  } catch (error) {
    Logger.log(`Error adding member: ${error}`);
  }
};

const testAddMember = () => {
  const spaceName = 'spaces/XXXXXXX'; // 置き換えてください
  const email = 'example@example.com'; // 置き換えてください

  addMember(spaceName, email);
};
```

できたものを見ると簡単にできる感じがしますね。
`spaceName`が２個目の引数に来るところがポイントです。

[Invite or add a user or a Google Chat app to a space  |  Google for Developers](https://developers.google.com/workspace/chat/create-members)

### patch

ユーザーのロールを変更するメソッドです。
これは`updateMask`をつけるところがポイントですね。
エラー文をよく見るとなんか書いてあるなーってことに気づきます。

```javascript
const updateMemberRole = (spaceName, email, newRole) => {
  const memberName = `${spaceName}/members/${email}`;
  const patchBody = {role: newRole};
  const updateMask = 'role';

  try {
    const response = Chat.Spaces.Members.patch(patchBody, memberName, {updateMask: updateMask});
    Logger.log(`Member role updated: ${response}`);
  } catch (error) {
    Logger.log(`Error updating member role: ${error}`);
  }
};

const testUpdateMemberRole = () => {
  const spaceName = 'spaces/XXXXXXX'; // 置き換えてください
  const email = 'example@example.com'; // 置き換えてください
  const newRole = 'ROLE_MEMBER'; // ROLE_MEMBER or ROLE_MANAGER

  updateMemberRole(spaceName, email, newRole);
};
```

[Update a user's membership in a Google Chat space  |  Google for Developers](https://developers.google.com/workspace/chat/update-members)

### remove

スペースからユーザーを削除するメソッドです。
これはスペース名からメンバーのメールアドレスまでつなげた文字列として渡してあげれば機能します。

```javascript
const removeMember = (spaceName, email) => {
  try {
    Chat.Spaces.Members.remove(`${spaceName}/members/${email}`);
    Logger.log(`Member removed: ${email}`);
  } catch (error) {
    Logger.log(`Error removing member: ${error}`);
  }
};

const testRemoveMember = () => {
  const spaceName = 'spaces/XXXXXXX'; // 置き換えてください
  const email = 'example@example.com'; // 置き換えてください

  removeMember(spaceName, email);
};
```

[Remove a user or a Google Chat app from a space  |  Google for Developers](https://developers.google.com/workspace/chat/delete-members)

## さいごに

今回の記事では、Google Apps Scriptを使ってGoogle Chat APIのChat.Spaces.Membersの5つのメソッドをどのように使用するかについて解説しました。すぐに実践で使えそうな具体的なコード例を記述したつもりです（ほぼほぼ自分のため）。これらのメソッドで効率的に管理できるようになりますね！

この記事が参考になれば幸いです。
質問やフィードバックがあれば、ぜひコメント欄で教えてください！