Trello に積まれたタスク群を jq 使っていい感じの CSV にする

## 最終形

```bash
$ jq -r '.cards[] | select(.closed == false) | select(.idList == "5add1d163d71c2014281fcd6") | [.name, .desc, .idList, .url] | @csv' board.json

"涼しくなったので風邪に注意する","- 早く帰る
- 早く帰る
- 早く帰る","5add1d163d71c2014281fcd6","https://trello.com/c/pCyAorwX/1224--",
... 省略
```

## 前置き

Trello は下記のようにメニューの奥のほうから JSON をエクスポートできます。

![スクリーンショット 2015-09-18 17.59.32.png](https://qiita-image-store.s3.amazonaws.com/0/17722/5ad7e7f5-b5f7-8cf3-148a-4de14f7af0cc.png)

![スクリーンショット 2015-09-18 17.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/17722/69ed537c-8a52-73a5-73b9-3141ac483519.png)

![スクリーンショット 2015-09-18 18.00.02.png](https://qiita-image-store.s3.amazonaws.com/0/17722/469ad87a-909d-cfb9-81a7-5f3cc2c1d515.png)


で、これを [jq](https://stedolan.github.io/jq/) 使っていい感じの CSV にしてみます。
今回は**「特定のリストに入っているカード一覧CVS」**の作成をゴールとしました。

## 過程

まずは下記のコマンドでjsonの第一階層がどうなってるのか調べます。

```bash
$ jq 'keys' board.json

[
  "actions",
  "cards",
  "checklists",
  "closed",
  "dateLastActivity",
  "dateLastView",
  "desc",
  "descData",
  "id",
  "idOrganization",
  "idTags",
  "invitations",
  "invited",
  "labelNames",
  "labels",
  "lists",
  "members",
  "memberships",
  "name",
  "pinned",
  "powerUps",
  "prefs",
  "shortLink",
  "shortUrl",
  "starred",
  "subscribed",
  "url"
]
```

なんとなく、 cards, lists, menbers 辺りに情報がつまっていそうです。
今度は cards の中身を覗いてみましょう。

```bash
$ jq '.cards[0] | keys' board.json

[
  "attachments",
  "badges",
  "checkItemStates",
  "closed",
  "dateLastActivity",
  "desc",
  "descData",
  "due",
  "email",
  "id",
  "idAttachmentCover",
  "idBoard",
  "idChecklists",
  "idLabels",
  "idList",
  "idMembers",
  "idMembersVoted",
  "idShort",
  "labels",
  "manualCoverAttachment",
  "name",
  "pos",
  "shortLink",
  "shortUrl",
  "subscribed",
  "url"
]
```

name, desc, idList, url 辺りをCSVに出力することにします。
また、closed が true だとアーカイブされているカードのようですので、今回はアーカイブされていないカードを出力することにします。
試しにその部分だけ取得してみましょう。

```
$ jq '.cards[] | select(.closed == false) | [.name, .desc, .idList, .url]' board.json

[
  "涼しくなったので風邪に注意する",
  "対策:\n- 早く帰る\n- 早く帰る\n- 早く帰る",
  "5add1d163d71c2014281fcd6", // リストのIDっぽいハッシュ値
  "https://trello.com/c/hoge/123"
]
...
```

それっぽいものが取れました。select を使って .closed の値でフィルタリングしています。
あとは、リストのIDでフィルタリングしてあげれば目的が達成できそうですので、リスト一覧を見てみます。

```bash
$ jq '.lists[] | select(.closed == false) | [ .id, .name, .closed ]' board.json

[
  "5add1d163d71c2014281fcd6",
  "TODO",
  false
]
...
```

こちらも closed が true だとアーカイブされているリストのようですので、select でフィルタしてみました。
今回は、この "TODO" リストに入っているカードを出力することにします。

```bash
$ jq '.cards[] | select(.closed == false) | select(.idList == "5add1d163d71c2014281fcd6") | [.name, .desc, .idList, .url]' board.json

[
  "涼しくなったので風邪に注意する",
  "対策:\n- 早く帰る\n- 早く帰る\n- 早く帰る",
  "5add1d163d71c2014281fcd6",
  "https://trello.com/c/hoge/123"
]
...
```

無事 TODO リストに入っているカードを出力することができました。
最後に r オプションと @csv を使い、CSVに出力します。

```bash
$ jq -r '.cards[] | select(.closed == false) | select(.idList == "5add1d163d71c2014281fcd6") | [.name, .desc, .idList, .url] | @csv' board.json

"涼しくなったので風邪に注意する","対策:
- 早く帰る
- 早く帰る
- 早く帰る","5add1d163d71c2014281fcd6","https://trello.com/c/pCyAorwX/1224--",
... 省略
```

無事 CSV が出力されました。セル内の改行も対応できていて、いい感じですね。

## あとがき

- Trello Pro版はCSV出力が可能です。とはいえ、いい感じに整形したCSVをコマンド一発で出すことは多分できないと思います。
- idList はリスト名で置換しても良さそうです。jq でも出来るのかもですが、sed でも使った方が楽だと思います。