Trelloでポモドーロテクニックの工数を管理するGASを作った

![pomodoro.png](https://qiita-image-store.s3.amazonaws.com/0/17214/075e0a57-b49c-b0df-42ce-296abe43e753.png "pomodoro technique")

背景 : ポモドーロテクニックにおける工数の見積もりと記録
---

先日[rebuild.fm](http://rebuild.fm/)というエンジニア向けpodcastで[ポモドーロテクニックについて話している回](http://rebuild.fm/139/)がありました。この中で言わずと知れたポモドーロテクニックの正しい実践方法が解説されておりましたが、そのうちの一つに**「工数の見積もりを記録して見積もり能力をチューニングしていく」**というものがありました。

これはタスクを作る時『このタスクには4ポモドーロかかるな』という見積もりを立てて、さらに実際にかかった工数も記録していくことで自分の見積もり能力がより洗練されていき、結果としてプロダクティビティの向上に繋がるというものでした。

自分も以前からを[Trello](https://trello.com/)を使ってポモドーロテクニック自体は実践していたのですが、この見積もりについてはやっていなかったので早速実践してみました。すると当然の帰結として**毎回手でSpreadsheetに見積もりと完了までの工数を記録するのが面倒になってきました。**

そこで今回、**指定したTrelloのリストにカードが追加/削除されたというイベントをそれぞれタスクが開始/完了したとみなしてGoogle Spreadsheetに記録するGoogle Apps Script(GAS)を作成しました**。
これで前述の見積もりと実際の工数の記録がカンタンになります。

残念ながらTrelloのイベントではなく、GAS側の定期実行イベントドリブンな仕様にはなってしまいます。しかし、正しいやり方が1ポモドーロあたり25分サイクルであることを考えれば、定期実行間隔は30分で十分かと思われます。

スクリプト本体
---

スクリプト本体は[gistにアップ](https://gist.github.com/imaizume/bf4bc132013bd129d45f11810c3357d4)しましたので、必要に応じてカスタマイズして使って下さい。
基本的にはこれをGoogleSpreadsheetの「ツール」>「スクリプトエディタ」から適当なスクリプトファイルに貼り付けて実行するだけですが、**プロパティにいくつか事前に設定しておく値があります**ので後述します。

スクリプトの仕様
---

### :factory: 処理の流れ

Trelloでは**『ボード』**と呼ばれるTODOの中に複数の**『リスト』**と呼ばれるミニTODOリストが作成でき、その中に**『カード』**という1つのTODOタスクを作ります。
いわゆる「カンバン式」でTODOをこなすことを想定した仕様になっていて、自分の場合は

* BACKLOG : とりあえず思いついたことをバンバン突っ込む
* SPRINT : 今スプリント内にこなすべきタスク
* TODAY : 今日やるタスク
* LATE : やり残したタスク
* PENDING : 何らかの事情で保留にしているタスク
* DONE : 完了したタスク

というリストを作っています。

今回作成したスクリプトは**『TODAYにカードが移ってきたらその内容を記録し、他のリストへカードが移動したら完了状態と日時を記録する』**ということを行っていきます。
全体の処理の流れは以下のとおりです。

![flow.jpg](https://qiita-image-store.s3.amazonaws.com/0/17214/b8e71a62-1a81-1eed-bdc0-3de3e255bc24.jpeg)

まず事前に指定したボードとリストを対象にカードを取得します。そして

1. 他のリストへ移動したカードでまだ作業中になっているものは**完了としてマーク**
2. Spreadsheetに記録がなければ**新規に記録を開始**
3. 過去に一度終了済みなら**再度新規に記録を開始**
4. **それ以外は何もしない**

として記録していきます。
スプレッドシートには**ボードごとにシートが作成されて**、このような記録がされていきます。

![spreadsheet.png](https://qiita-image-store.s3.amazonaws.com/0/17214/d44df959-3a48-925e-3e1f-53e3594ad131.png)

* **ID** : APIで取得される各カードのID
* **Name** : カードのタイトル
* **List** : カードの属するリスト
* **Labels** : Spreadsheet記録時点でのラベル
* **ShortURL** : カードのショートURL
* **URL** : カードのURL
* **Status** : タスクの状態 (working/finished)
* **Estimate** : 見積もり工数
* **Actual** : (手入力) 実工数
* **Difference** : 実工数 - 見積もり工数
* **Start Date** : Spreadsheetに新規に記入した時間
* **Start Date** : Statusを完了(finished)にした時間

実工数を完了時間から自動で割り算して記録しようかとも思ったのですが、時間がなかったのと、タスクが終わってすぐにリストを移すのを忘れることもあるかと思ったため、ここだけ手入力するという仕様で割愛させて頂きました。

### 事前の設定事項

スクリプトを実行する前に以下の値を「ファイル」>「プロジェクトのプロパティ」>「スクリプトのプロパティ」からキーと値を設定して下さい

![script-properties.png](https://qiita-image-store.s3.amazonaws.com/0/17214/47064b8f-35e7-aa46-cfd6-ad5df865951a.png)

#### :key: TrelloのAPI Key(`key`)とToken(`token`)

Trelloでユーザー認証するために、API KeyとAPI Tokenを[こちら](https://trello.com/app-key)から取得します。
APIKeyはページ内すぐ、API Tokenは同じページ内の"...you can manually generate a _Token_."のリンクから飛んで認証すると取得できます。

これらの値をそれぞれ`key`, `token`というキーに対して設定して下さい。

また別途`user`というキーに対してTrelloのユーザー名を設定します。

**[2016/06/16 追記]**

![2016-06-16_11h48_35.png](https://qiita-image-store.s3.amazonaws.com/0/17214/94c1e9e5-9cc8-6c01-4aa5-c083f5ec4db4.png)

一定期間(1ヶ月くらい?)経つと、上記のような401エラーが発生します。

![2016-06-16_11h48_49.png](https://qiita-image-store.s3.amazonaws.com/0/17214/43c71f45-b9e2-2633-4509-489ddddd3821.png)

URLを直打ちしたら、このような画面が出るかと思うので、手間ですがトークンを新しく生成してください。

#### :video_camera: 記録対象のボード名(`boards`)とリスト名(`lists`)

どのボード、リストのカードを取得するかを指定します。
ここで指定したボードとリスト名に一致したカードのみが記録されます。
複数指定したい場合はカンマ区切りで入力して下さい(例: "Private,Job")。

Spreadsheetはボードごとに分ける仕様で、リストは同じボードに複数する場合も同一シートに書き出されるようになっています。

#### :pencil2: (任意) 見積もり工数をカード名から取得する時の正規表現(`pattern`)

例えばカード名を「[3] 部屋の掃除をする」にした場合**`pattern`に`^\[((\d+)(\.\d+)?)\]`を設定しておけば、自動で見積もり工数3が入力されます。**
また名前には「[3]」を取り除いたタスク名の部分が記録されるようになっています。

現在のスクリプトでは[最初のマッチ部分を工数として認識させています](https://gist.github.com/imaizume/bf4bc132013bd129d45f11810c3357d4#file-trello-to-spreadsheet-gs-L170)。

#### :wrench: (任意) 実際の工数に入力されるデフォルト値(`actual`)

指定しない場合は、実際にかかった工数の欄が初期状態で空のセルになります。

終わりに
---

初めてTrello APIを使ってみましたが、[APIリファレンス](https://developers.trello.com/advanced-reference)が分かりやすくて実装がとてもカンタンでした。
前述のように、今回はリストに入ったカードをSpreadsheetに起こすというだけの仕様になっています。
当面はこれで事足りますが、自動の実工数入力や統計は手動でとってもらうようになっているので、そこらへんも自動化できたら良いかなと思います。

参考
---

* [Rebuild 139 Productivity Extremist (higepon)](http://rebuild.fm/139/)
* [Basic JavaScript features - Goolge Apps Script](https://developers.google.com/apps-script/guides/services/#basic_javascript_features)
* [API Reference - Trello Developers](https://developers.trello.com/advanced-reference)

2016年8月15日追記 : Trello で工数管理ができるChrome拡張機能
---

ChromeやFirefoxには [Scrum for Trello](https://chrome.google.com/webstore/detail/scrum-for-trello/jdbcdblgjdpmfninkoogcfpnkjmndgje) という拡張機能があり、[Burndown for Trello](https://www.burndownfortrello.com/#)と合わせて使うことでバーンダウンチャートを作成できるみたいです。