GASでChatworkを自由自在に操る方法

# はじめに
この記事は [LIFULLその2 Advent Calendar 2019](LIFULLその2 Advent Calendar 2019) の12日目の記事です。
Qiita初投稿！:kissing_smiling_eyes:
こよなく愛するGoogleAppsScript(GAS)とChatworkAPIについて書きます。

# GoogleAppsScript(GAS)について
GoogleAppsはもちろんのこと、他のサービスとも連携して
特にGoogleAppsであるスプレッドシートやフォーム、カレンダーなどとの連携では抜群の威力を発揮します。

# Chatwork APIについて
Chatworkは、Chatwork株式会社が提供するクラウド型ビジネスチャットツールであり、
Chatwork APIは外部のプログラムから簡単に使用できたり、Chatworkで発生したイベントを外部のプログラムに提供することができるAPIのことです。

# GoogleAppsScript(GAS) X Chatwork API
ここからが本編です。
上記それぞれについてはググると色々出てくるので、そちらを参考にしてください。
ここでは触れません。
Chatwork社公式ではありませんが、
GAS上で簡単にChatwork APIを使用するためのChatWorkClientライブラリなるものがあります。

[cw-shibuya/chatwork-client-gas](https://github.com/cw-shibuya/chatwork-client-gas)
※ライブラリの導入方法についても、他に紹介記事がありますので、調べてください。

ただ、他の記事では、ほとんどが「sendMessage」について書かれているものが多いです。
私も、普段メッセージを送る機会しかなかったので「sendMessage」しか使ってこなかったのですが、
今回メッセージを送る以外の用途が生まれ、そういえはライブラリで何が使えるんだっけと調べていく中で
色々と発見したので、そちらを共有します。

# ChatWorkClientライブラリで用意されているもの
Githubで公開されている [client.js](https://github.com/cw-shibuya/chatwork-client-gas/blob/master/client.js)を見ていただくとわかるのですが、以下のメソッドが用意されていました。

|メソッド名 |用途|
|----------|---------|
|getRooms  |自分のルーム一覧を取得|
|sendMessage|メッセージ送信|
|sendMessageToMyChat|マイチャットへのメッセージを送信|
|getMessages|指定したチャットのメッセージを取得|
|sendTask|タスク追加|
|getRoomTasks|指定したチャットのタスク一覧を取得|
|getMyTasks|自分のタスク一覧を取得|
どういうパラメータを渡せばよいかは、Github上のソースを見た方が早いです。
目的が上記で収まる場合は上記メソッドを使えばよいのですが、それ以外は目的ごとのメソッドが用意されていません。
代わりに、「post」「put」「get」３つのメソッドがあり、
これらは、それぞれの操作に応じてエンドポイントとパラメータを自由に指定できるため、
実は「post」「put」「get」の３つのメソッドさえ使えば、
Chatwork APIのマニュアルに書かれているものすべて使用できるのです。
ただ、用意されているメソッドを用いた方が読みやすいため、
極力、目的別メソッドで事足りる場合は使う方をお勧めします。

# 実践
今回、
**「特定のチャットルームにいる全員に対してタスク登録をする」**
というものを作ります。
※既にChatWorkClientライブラリを組み込んでいるという前提です

工程は以下です。
<strong>
1. 対象のルーム内にいるアカウントを取得
2. 1のアカウントIDを配列に入れる
3. タスク登録用のメソッドを作成し、実行する
</strong>
これだけです。
2の工程が必要なのは、タスクを登録する際に、アカウントIDを配列で指定する必要があるためです。

## 1. 対象のルーム内にいるアカウントを取得

```javascript
var apiToken = '123';
var client = ChatWorkClient.factory({token: apiToken});
```
まずはChatworkAPI呼び出し用のオブジェクト「client」を生成し、

```javascript
var roomId = '123';
var method = "/rooms/" + roomId + "/members";
var params = {};
var membersInfo = client.get(method, params);
```

といったように、使用したいAPIのエンドポイントとパラメータを指定します。
今回は [GET /rooms/{room_id}/members](http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-members) を使用したいため、{room_id}のところに取得したいチャットルームIDを指定します。

なお、全ルーム取得したい場合は

```javascript
var rooms = client.getRooms();
```
もしくは

```javascript
var rooms = client.get("/rooms", {});
```
で取得します。
（後者は動作確認していないです。ごめんなさい）

## 2. 1のアカウントIDを配列に入れる
次に、
[GET /rooms/{room_id}/members](http://developer.chatwork.com/ja/endpoint_rooms.html#GET-rooms-room_id-members)  のレスポンス例を見ていただくとわかるのですが、
個々のアカウントが配列に格納され、
それぞれの配列の中にある「account_id」にアカウントごとのアカウントIDが返ってきます。
本来はこれを、タスク登録用のメソッド [POST /rooms/{room_id}/tasks](http://developer.chatwork.com/ja/endpoint_rooms.html#POST-rooms-room_id-tasks) で送るには
アカウントIDをカンマ区切りの文字列で指定する必要があるのですが、
ChatWorkClientライブラリで用意されている「sendTask」内部で
「to_id_list」をカンマ区切りの文字列に変換する処理が入っていますので、
配列に格納し、それをそのまま渡します。

```javascript
membersId = [];
for(var i=0; i<membersInfo.length; i++) {
  membersId.push(membersInfo[i]['account_id']);
}
```

## 3. タスク登録用のメソッドを作成し、実行する
あとは最後にタスク登録するだけです。
limitにはUnix timeで指定する必要があるため、そこだけ注意です。
limitパラメータに時間も指定したUnix timeを指定すれば、時間指定ありの期限設定も可です。

```javascript
var date = new Date(2019, 11, 25); // 月は0開始のため、12月は"11"を指定
var unixTimestamp = Math.round( date.getTime() / 1000 );
client.sendTask({
  room_id   : roomId,
  body      : "クリスマスまでにやってね",
  to_id_list: membersId,
  limit     : unixTimestamp
});
```

# 最後に
今回は「get」「sendTask」を使った事例を紹介しましたが、
用意されているメソッドを駆使すればChatworkAPIで紹介されている機能全て使えますので、
色々試してみてください。