📘 hkob-astro-notion-blog

これまではてなブログにて情報発信をしていましたが、令和5年3月22日より、こちらでの情報発信を始めました。2019年以前の古い記事は過去の Middleman 時代のものなので、情報が古いです。記録のためだけに残しています。

GTDテンプレートのスプリント移行(3)

1. はじめに

タスク管理をスプリントに移行しましたが、周辺ツールも移行が必要になります。Apple Watch で一番活躍している StartStopTask はかなり影響を受けるので作り直しました。ショートカットアプリの修正のために、Tasks データベースも少し変更が必要だったので、それも記録しておきます。

2. Tasks データベースの修正

これまで StartStopTask アプリは今日のタスク一覧を取得して、開始するタスクの候補を表示していました。今回スプリントに移行することで、日付が設定されていないタスクも存在することになりました。このため、絞り込み条件は以下のようになります。

  1. タスクが Current スプリントに存在すること
  2. タスクが曜日ごとにプロジェクトに存在すること

1 はあらかじめ Sprint を取得することでフィルタすることが可能ですが、2 をショートカット側で頑張ろうとすると大変です。そこでデータベース側で補助となるプロパティを用意することにしました。

2.1 Project データベースに wday を追加

数値プロパティの wday を追加しました。プロジェクトは7個しかないので、曜日に相当する0から6までの値を直接設定しました。

2.2 Task データベースに wday のロールアップを追加

_wday として、プロジェクトの wday をタスクにロールアップしてきます。数値として取り出したいので、計算は最大としておきます。

_today? として、今日の曜日に対応するプロジェクトに所属するタスクの場合にチェックが入るフォーミュラを追加しました。

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

結果としてこんなアクションを並べました。

タスクの取得部分は以下のクエリになります。

  1. Task の status プロパティが Done でないこと
  2. Task のスプリントが上で取得した sprint_id であること
  3. 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 のおかげですね。この機能作っておいて本当によかった。