📘 hkob-astro-notion-blog

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

親タスクの時間を自動設定する Notion サブタスクシステムの作成

1. はじめに

3/22 にサブアイテムのフィルタが子タスクに対しても適用されるようになりました。このフィルタができなかったため、これまでサブタスクとしての活用は難しいものがありました。今回、このフィルタ対応ができるようになったので、いよいよサブタスクでの運用ができるようになります。せっかくなので、サブタスクを Notion で実現するためのやり方を解説してみたいと思います。

2. データベースの作成

ひとまずデータベースをいつものようにフルページで作成します。データベース置場を下に用意し、そこに「サブタスクデータベース」を置きます。

サブタスクデータベースはひとまずタスク名、日付、ステータスのみ用意します。

早速サブアイテムを設定します。名前はサブタスクと親タスクに設定します。

親タスクは機能的に複数個設定をしたくないので、制限を「1ページ」にしておきます。

テストデータをいくつか入れてみます。タスクの下に子、この下に孫が入ったものがあります。みてわかるようにサブタスクは単なる自己リレーションです。サブタスクと親タスクはこの説明のために表示していますが、ここでは必要ないので非表示にしておきます。

3. 子の時間から親の時間を設定

ガントチャートなどでは、子タスクの時間によって親の時間が伸縮するような仕組みが用意されています。Notion では日付を設定することはできないので、ここはフォーミュラで吸い上げる仕組みを作成します。最初にテスト用に一番下のタスクにテスト用に日付を入れておきます。

3.1 開始時間の取得

ロールアップは仮のものを一度設定し、フォーミュラを設置後に修正する必要があります。手順が複雑なので順を追って説明します。

最初は仮のロールアップの設定です。サブタスクに対して、日付プロパティの最も古い日付を取得します。このプロパティには「_子の最古開始時間」のように「_」を付けて中間値であることを強調します。この結果、サブタスクに日付が設定されている「子A-1」だけに値が入りました。

孫タスクは自分に時間が設定されているので、その開始時間を吸い出したいです。日付が設定されていたらその開始時間を取り出すフォーミュラを書けばいいことになります。これを開始時間というプロパティで保存します。

empty(prop("日付")) ? prop("_子の最古開始時間") : start(prop("日付"))

この状態だと孫の時間は一番上のタスクまで伝わりません。そこで、仮設定したロールアップを再設定します。参照していたプロパティを、日付から先ほど設定した開始時間フォーミュラに変更します。この結果、末端のタスクに時間が設定されれば一番上のタスクにまで時間が設定されました。ロールアップはもう必要ないので、こちらも非表示にしてしまいましょう。

3.2 終了時間の取得

やることは開始時間と変わりませんので、手順のみ掲載しておきます。最初は日付によるロールアップです。こちらは最も新しい日付になります。

終了時間のフォーミュラも同じです。違いは end 関数を使っているところだけです。

empty(prop("日付")) ? prop("_子の最新終了時間") : end(prop("日付"))

こちらもロールアップを更新します。日付の変わりに「終了時間」に変更するだけです。

3.3 タイムラインビューの設定

今回作成した開始時間・終了時間フォーミュラを使って、タイムラインビューを設定してみます。タイムラインビューをデータベースに追加し、以下のように設定します。

  • 開始日: 開始時間フォーミュラを指定
  • 開始日と終了日を別々に設定: オン
  • 終了日: 終了時間フォーミュラを設定

ただし、この日付はフォーミュラで設定しているために、引っ張ったり移動したりすることはできないので注意してください。

4. トップページとタスクテンプレートの作成

4.1 トップページの作成

データベースの方でビューを作成していると、Linked view ではそのビューを呼び出して使うことができます。とりあえずトップページには両方表示しておきましょう。

4.2 子タスクのテンプレート (親ページによる絞り込み)

ここまではこれまでのサブアイテムでも実施できたことでした。今日の子タスクへのフィルタ適用ができるようになったため、タスクページの中に自分の子タスクを表示できるようになりました。具体的には、親タスクがこのテンプレートの名前である「無題」に設定することにより、自動的にテンプレート適用時に自分自身がフィルタに設定されます。

このテンプレートを元にタスクAのテンプレートを作成してみましょう。このようになりました。自動的にフィルタが設定されるのは便利なのですが、残念ながら孫タスクまでは表示されないですね。仕組みからして仕方ないのですが。

4.3 改良版子タスクのテンプレート (ルーツによる絞り込み)

祖先の情報でフィルタをするためには、自分のルーツを知る必要があります。このために、自分のルーツを計算するフォーミュラを作成します。こちらもロールアップとの連携が必要であり、今回も仮のロールアップ作成が必要となります。もう一度サブタスクデータベースのページに戻りましょう。

前回と同様に仮ロールアップ(_親のルーツ)を作成します。今回は親タスクに対して、名前のオリジナルを表示します。オリジナルを表示は配列になるのですが、今回は親を「1ページ」に制限したので必ず一つしか取得されないことになります。

自分のルーツは親のルーツにタスク名を追加すればいいことになります。このフォーミュラにより、ひとまず自分の親の名前と自分の名前が並ぶことになります。

この状態ではまだ祖先の名前が引っ張ってこれていません。そこで、仮設定したロールアップの「名前」の部分を「ルーツ」に変更します。これによってトップからの名前を連結したものが「ルーツ」に設定されたことになります。

最後にフィルタをルーツによるもの(○○で始まる)に変更します。値の部分は自動設定できないので、値だけ入力できるようにしておきます。

このテンプレートを先ほどの「タスクA」に適用し直してみます。フィルタを開き、このページの「ルーツ」プロパティに設定されている「タスクA」をフィルタに設定します。この部分が手作業になってしまうのが残念ですね。

5. 子の進捗率の計算

子の完了率をロールアップで集計してみます(_子の進捗率)。直下のタスクの完了率はこのようにロールアップで計算できます。しかし、これも当然ながら、一番上まで伝わるわけではありません。また、親の完了状況も自動集計したいところです。

作成した_子の進捗率を使って進捗率を作成してみます。ステータスが Not started の場合には、先ほどの _子の進捗率を小数点以下1桁に丸めた値を設定します。一方、ステータスが Done の場合にも 1 となるようにします。

進捗率が子供の統計かステータスのいずれかで計算できるようになったので、_子の進捗率を実際に子タスクの集計値に変更することにします。

タスクが完了したかどうかは進捗率が1になっているかどうかを調べればよいです。簡単なフォーミュラですね。

prop("進捗率") == 1

6. まとめ

結果としてこんな感じになりました。

今回のシステムでできるようになったことはこちらになります。

  • 末端のタスクの日付が親の開始時刻、終了時刻として設定できます。
  • 進捗率は子タスクの単純完了率ではなく、末端のタスクの完了の平均で計算されます。

手元で確認したいという人は、以下のリンクから複製してみてください。

https://www.notion.so/hkob/Notion-24a468afe12b4cef8a7e61da34ff7204

P.S.

astro-notion-blog の最初の記事になりました。今後はこちらで情報発信をしていく予定です。