1. はじめに
タスク管理をスプリントに移行しましたが、周辺ツールも移行が必要になります。Apple Watch で一番活躍している StartStopTask はかなり影響を受けるので作り直しました。ショートカットアプリの修正のために、Tasks データベースも少し変更が必要だったので、それも記録しておきます。
2. Tasks データベースの修正
これまで StartStopTask アプリは今日のタスク一覧を取得して、開始するタスクの候補を表示していました。今回スプリントに移行することで、日付が設定されていないタスクも存在することになりました。このため、絞り込み条件は以下のようになります。
- タスクが Current スプリントに存在すること
- タスクが曜日ごとにプロジェクトに存在すること
1 はあらかじめ Sprint を取得することでフィルタすることが可能ですが、2 をショートカット側で頑張ろうとすると大変です。そこでデータベース側で補助となるプロパティを用意することにしました。
2.1 Project データベースに wday を追加
2.2 Task データベースに wday のロールアップを追加
3. StartStopTask ショートカットの修正
最初は Current スプリントを取得してくる部分です。いつものように payload は NotionRubyMapping で作成します。スクリプトはこちら。
sdb = Database.find "d8a81b250f7348b89639b63970d5871e"
sp = sdb.properties["Sprint status"]
query = sp.filter_equals "Current"
print sdb.query_database(query, dry_run: true)
結果から payload を取得するとこのようになりました。
{"filter":{"property":"Sprint status","status":{"equals":"Current"}},
"page_size":100}'=> nil
結果としてこんなアクションを並べました。
タスクの取得部分は以下のクエリになります。
- Task の status プロパティが Done でないこと
- Task のスプリントが上で取得した sprint_id であること
- 2. で作成した _today? フォーミュラの checkbox の値が true であること
これも payload を自動生成してみます。
tdb = Database.find "1fd72fc2a18247e2a9d347b67e5f9cf0"
sp, spp, tp = tdb.properties.values_at "Status", "Sprint", "_today?"
query = sp.filter_does_not_equal("Done")
.and(spp.filter_contains("obtained sprint_id"))
.and(tp.filter_equals(true, another_type: "checkbox"))
print tdb.query_database(query, dry_run: true)
生成された payload はこうなりました。
{"filter":{"and":[{"property":"Status","status":{"does_not_equal":"Done"}},
{"property":"Sprint","relation":{"contains":"obtained sprint_id"}},
{"property":"_today?","formula":{"checkbox":{"equals":true}}}]},
"page_size":100}
そこから作成したアクションはこうなります。
4. おわりに
これでスプリント対応の StartStopTask になりました。実際に Apple Watch で動作することを確認しました。テキストで JSON が直接かけることがわかってから、ショートカットの作成が本当に楽になりましたね。これも NotionRubyMapping の dry_run のおかげですね。この機能作っておいて本当によかった。