Trelloのtodoタスクをchatworkに通知する

本記事は[マイネット Advent Calender](http://qiita.com/advent-calendar/2016/mynet)16日目の記事です。

# はじめに
今回やることは「Trelloのtodoタスクをchatworkにリマインド通知する」です。

みなさんは仕事をする上でタスク管理をどのようにしていますか？
私はTrelloを使って個人のタスクを管理しています。
使い方としてはこれから行う予定のタスクをtodoリストに追加し、完了したらdoneリストに移動する、というシンプルな使い方をしています。
今回のアドベントカレンダーを元にタスクを管理すると次の画像のような使い方です。
![スクリーンショット 2016-12-17 1.55.10.png](https://qiita-image-store.s3.amazonaws.com/0/76876/36ab8b7f-7ee1-7e2c-49b0-bab984595009.png)
(予約投稿は間に合いませんでした・・・)

Trello開いていれば何も問題はなく特に困ることはないのですが、アドベントカレンダーのネタに困ってしまったのでリマインドする機能を作ることにしました。

# 準備するもの
- Trello APIを使用するために必要なトークン
- Chatwork APIのトークン

まず、Trello API用のトークンを取得します。
[Trello developers ページ](https://developers.trello.com/)の "Get Started" を開くと"Get Your Application Key" と書かれたボタンがあるので、ポチッと押します。
すると API Key が表示されます。(Trelloにログインしていないと取れません)
その近くに "you can manually generate a Token." と記載されているので、さらにポチッと押します。
トークンを使用するか確認する画面が出てくるので"Allow"。
するとAPI Tokenが表示されます。

次に、chatwork用のトークンを取得します。
[Chatworkのページ](http://developer.chatwork.com/ja/) からAPIの利用申請を行う必要があります。
利用できるようになるとメールが届くので、その後Chatworkにログインし "動作設定" -> "API発行" よりトークンを取得できます。
最後に、通知を送信するチャットのルームIDを取得します。
Chatworkを開くとURLが "https://www.chatwork.com/#!ridxxxxxxxx" のようになっていると思います。
ridの後にある数字がルームIDです。
(トークンを取得したアカウントが発言権限付きでこのチャットに追加されている必要があります)

これで、以下の4つが揃ったはずです

- Trello API Key
- Trello API Token
- Chatwork API Token
- Chatwork Room Id

# コード
必要なものは揃ったので、コードを書いて動かしてみます。
手軽に作れて、時間をトリガーにした通知が簡単なので、Google App Script を使用しました。

```js:main.gs
function main() {
  // "advent calendar"ボードの"todo"リストを通知する
  var TARGET_BOARDS = "advent calendar"
  var TARGET_LIST = "todo"
  
  // "advent calendar"のボードIDを取得
  var boardId = getItemId("members",USER_ID,"boards",TARGET_BOARDS)
  Logger.log(boardId)
  
  // "todo"のリストIDを取得
  var listId = getItemId("boards", boardId, "lists", TARGET_LIST)
  Logger.log(listId)
  
  // リスト中のカードを取得
  var url = buildTrelloUrl("lists",listId,"cards")
  var cards = JSON.parse(UrlFetchApp.fetch(url).getContentText())["cards"];
  
  var message = "以下のタスクが未完了です\n[info]"
  for(var i=0; i<cards.length; i++){
    message += cards[i].name + "\n"
  }
  message += "[/info]"
  
  postToChatwork(message)
}

function getItemId(api, id, item, targetName){
  // 1階層下のアイテムを取得する
  var url = buildTrelloUrl(api, id, item)
  var list = JSON.parse(UrlFetchApp.fetch(url).getContentText())[item];
  
  // 対象のIDを取得
  for(var i=0; i<list.length; i++){
    if(list[i]["name"] == targetName){
      return list[i]["id"];
    }
  }
}

function buildTrelloUrl(api, id, item){
  return "https://api.trello.com/1/" + api + "/" + id + "?key=" + API_KEY + "&token=" + TRELLO_TOKEN + "&" + item + "=open"
}

function postToChatwork(message){
  var options = {
    "method" : "post",
    "headers" : {"X-ChatWorkToken" : CHATWORK_TOKEN},
    "payload" : {"body" : message}
  }
  
  var url = "https://api.chatwork.com/v1/rooms/" + ROOM_ID + "/messages"
  UrlFetchApp.fetch(url, options)
}
```
Token や Key などは、定数として定義してあります。

- USER_ID = TrelloのユーザID
- API_KEY = Trello API Key
- TRELLO_TOKEN = Trello API Token
- CHATWORK_TOKEN = Chatwork API Token
- ROOM_ID = Chatwork Room Id

TrelloのユーザID以外はすでに取得しているはずです。

# 動作確認
実行してみます、Trelloのボードの状態は最初の画像のままです。
![スクリーンショット 2016-12-17 3.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/76876/19f0c5fe-7b7b-c07c-4477-ceffdb344ca5.png)
todoリストのタスクがチャットワーク上にて通知されました。

# おわりに
いかがでしたでしょうか
今回はTrello APIを利用してカードを取得するだけでしたが、リストやカードの追加、カードの期限などの詳細な情報の取得、などなど多くのAPIが用意されているので、興味を持たれた方がいたら是非試してみて下さい。

以上、読んでいただきありがとうございました。

[マイネット Advent Calender](http://qiita.com/advent-calendar/2016/mynet) 次回は[aono](http://qiita.com/aono)さんです。