1. はじめに
3/22 にサブアイテムのフィルタが子タスクに対しても適用されるようになりました。このフィルタができなかったため、これまでサブタスクとしての活用は難しいものがありました。今回、このフィルタ対応ができるようになったので、いよいよサブタスクでの運用ができるようになります。せっかくなので、サブタスクを Notion で実現するためのやり方を解説してみたいと思います。
2. データベースの作成
テストデータをいくつか入れてみます。タスクの下に子、この下に孫が入ったものがあります。みてわかるようにサブタスクは単なる自己リレーションです。サブタスクと親タスクはこの説明のために表示していますが、ここでは必要ないので非表示にしておきます。
3. 子の時間から親の時間を設定
ガントチャートなどでは、子タスクの時間によって親の時間が伸縮するような仕組みが用意されています。Notion では日付を設定することはできないので、ここはフォーミュラで吸い上げる仕組みを作成します。最初にテスト用に一番下のタスクにテスト用に日付を入れておきます。
3.1 開始時間の取得
ロールアップは仮のものを一度設定し、フォーミュラを設置後に修正する必要があります。手順が複雑なので順を追って説明します。
最初は仮のロールアップの設定です。サブタスクに対して、日付プロパティの最も古い日付を取得します。このプロパティには「_子の最古開始時間」のように「_」を付けて中間値であることを強調します。この結果、サブタスクに日付が設定されている「子A-1」だけに値が入りました。
孫タスクは自分に時間が設定されているので、その開始時間を吸い出したいです。日付が設定されていたらその開始時間を取り出すフォーミュラを書けばいいことになります。これを開始時間というプロパティで保存します。
empty(prop("日付")) ? prop("_子の最古開始時間") : start(prop("日付"))
この状態だと孫の時間は一番上のタスクまで伝わりません。そこで、仮設定したロールアップを再設定します。参照していたプロパティを、日付から先ほど設定した開始時間フォーミュラに変更します。この結果、末端のタスクに時間が設定されれば一番上のタスクにまで時間が設定されました。ロールアップはもう必要ないので、こちらも非表示にしてしまいましょう。
3.2 終了時間の取得
3.3 タイムラインビューの設定
今回作成した開始時間・終了時間フォーミュラを使って、タイムラインビューを設定してみます。タイムラインビューをデータベースに追加し、以下のように設定します。
- 開始日: 開始時間フォーミュラを指定
- 開始日と終了日を別々に設定: オン
- 終了日: 終了時間フォーミュラを設定
ただし、この日付はフォーミュラで設定しているために、引っ張ったり移動したりすることはできないので注意してください。
4. トップページとタスクテンプレートの作成
4.1 トップページの作成
4.2 子タスクのテンプレート (親ページによる絞り込み)
ここまではこれまでのサブアイテムでも実施できたことでした。今日の子タスクへのフィルタ適用ができるようになったため、タスクページの中に自分の子タスクを表示できるようになりました。具体的には、親タスクがこのテンプレートの名前である「無題」に設定することにより、自動的にテンプレート適用時に自分自身がフィルタに設定されます。
このテンプレートを元にタスクAのテンプレートを作成してみましょう。このようになりました。自動的にフィルタが設定されるのは便利なのですが、残念ながら孫タスクまでは表示されないですね。仕組みからして仕方ないのですが。
4.3 改良版子タスクのテンプレート (ルーツによる絞り込み)
祖先の情報でフィルタをするためには、自分のルーツを知る必要があります。このために、自分のルーツを計算するフォーミュラを作成します。こちらもロールアップとの連携が必要であり、今回も仮のロールアップ作成が必要となります。もう一度サブタスクデータベースのページに戻りましょう。
前回と同様に仮ロールアップ(_親のルーツ
)を作成します。今回は親タスクに対して、名前のオリジナルを表示します。オリジナルを表示は配列になるのですが、今回は親を「1ページ」に制限したので必ず一つしか取得されないことになります。
この状態ではまだ祖先の名前が引っ張ってこれていません。そこで、仮設定したロールアップの「名前」の部分を「ルーツ」に変更します。これによってトップからの名前を連結したものが「ルーツ」に設定されたことになります。
このテンプレートを先ほどの「タスクA」に適用し直してみます。フィルタを開き、このページの「ルーツ」プロパティに設定されている「タスクA」をフィルタに設定します。この部分が手作業になってしまうのが残念ですね。
5. 子の進捗率の計算
子の完了率をロールアップで集計してみます(_子の進捗率
)。直下のタスクの完了率はこのようにロールアップで計算できます。しかし、これも当然ながら、一番上まで伝わるわけではありません。また、親の完了状況も自動集計したいところです。
作成した_子の進捗率
を使って進捗率を作成してみます。ステータスが Not started
の場合には、先ほどの _子の進捗率
を小数点以下1桁に丸めた値を設定します。一方、ステータスが Done
の場合にも 1 となるようにします。
6. まとめ
結果としてこんな感じになりました。
今回のシステムでできるようになったことはこちらになります。
- 末端のタスクの日付が親の開始時刻、終了時刻として設定できます。
- 進捗率は子タスクの単純完了率ではなく、末端のタスクの完了の平均で計算されます。
手元で確認したいという人は、以下のリンクから複製してみてください。
https://www.notion.so/hkob/Notion-24a468afe12b4cef8a7e61da34ff7204
P.S.
astro-notion-blog の最初の記事になりました。今後はこちらで情報発信をしていく予定です。