サブタスクの全ての時刻を含む日付範囲を集計する Formula: Notion Tips (162)

はじめに

Notion Tips の第162回目はサブタスクの範囲を親で集計する Formula を紹介します。

なお、12月1日になり、今年も Yuka’s Studio でユカスタマスのイベントが今年も開催されることになりました。このブログは昨年の12月1日からユカスタマスのイベントで始まったものでした。当初12月だけの予定が、そのまま引き続き 366日続いてしまったということです。今年も一緒にユカスタマスを盛り上げていこうと思います。

末端のタスクのみを取得する Formula

昨日は一つのフォーミュラで末端タスクの Status 統計を集約しました。基本的に今回は末端のタスクしか作業しないので、「末端?」という Formula を作っておきます。

prop("サブアイテム").empty()

ここで、末端?にチェックありになっているものだけフィルターすることで、末端だけが有効になり使いやすいと思いました。

「末端?」を追加

進捗率の再設計

この末端?を使うことで、昨日の進捗率は少し簡単に書けるようになりました。

lets(
    statuses, 
        prop("末端?") ? [prop("ステータス")] : 
            prop("サブアイテム").map(current.prop("末端?") ? current.prop("ステータス") :
                current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("ステータス") :
                    current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("ステータス") :
                        current.prop("サブアイテム").map(current.prop("ステータス"))
                    ).flat()
                ).flat()
            ).flat(),
    count, statuses.length(),
    finish, statuses.map((current == "完了").toNumber()).sum(),
    finish / count
)

末端時刻範囲

次に親の時刻を末端の時刻などから集計できるようにしてみましょう。計算のために末端の一番古い開始時刻と一番新しい終了時刻を取得し、日付範囲を作成します。末端時刻範囲は以下のようになりました。最初に dates のリストを作ってから、dateStart や dateEnd、filter, min や max などの関数をかけようとしたのですが、型が確定しないためか数式が記述できませんでした。ほとんど同じ内容を二回書いています。そもそもこの記事の書き初めは、タスクの一覧を関数で取得する予定だったのですが、それもページのリストを確定できないためか、current からプロパティを取得できず挫折しました。とりあえず無駄が多いですが、動けばよいのでよしとします。

lets(
    startDate,
        prop("末端?") ? prop("日付").dateStart() : 
            prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateStart() :
                current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateStart() :
                    current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateStart() :
                        current.prop("サブアイテム").map(current.prop("日付").dateStart())
                    ).flat()
                ).flat()
            ).flat()
            .filter(current)
            .min(),
    endDate, 
        prop("末端?") ? prop("日付").dateEnd() : 
            prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateEnd() :
                current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateEnd() :
                    current.prop("サブアイテム").map(current.prop("末端?") ? current.prop("日付").dateEnd() :
                        current.prop("サブアイテム").map(current.prop("日付").dateEnd())
                    ).flat()
                ).flat()
            ).flat()
            .filter(current)
            .max(),
    startDate.dateRange(endDate)
)

結果は以下のようになりました。

末端時刻範囲

オートメーションの作成

時刻も記録したいので以下のようにオートメーションを設定してみます。

  1. タスクを進行中に設定
    1. 日付の開始時刻を現在時刻に設定。終了時刻があればそのままなければ現在時刻+1時間後に設定
    2. 進捗率が1でなく完了のタスクを進行中に設定
  2. タスクを完了に設定
    1. 日付の終了時刻を現在時刻に設定
    2. 進捗率が1で完了でない祖先タスクを完了に設定
  3. ページを作成
    1. 進捗率が1でなく完了のタスクを進行中に設定

Set start time

オートメーションは以下のようにしました。

Set start time

日付の自分の値は以下のようにしています。

Set start time の自分の値

lets(start_date, prop("トリガーページ").prop("日付").,
    end_date, start_date.empty() ? prop("トリガーされた時間").dateAdd(1, "hours") : start_date.dateEnd(),
    prop("トリガーされた時間").dateRange(end_date))

ページを更新のフィルタは以下のようにしています。

Set start time のフィルタ

set end time

昨日の完了処理をチェックボックスの外した時に移行しました。少し複雑になっています。昨日と違って、日付をトリガーページの末端時刻範囲に設定する処理を追加しています。

Set end time のオートメーション

日付の自分の値は以下のように設定しています。

Set end time の自分の値

prop("トリガーページ").prop("日付").dateRange(prop("トリガーされた時間"))

二件のフィルタは昨日と同じです。

Set end time のフィルタ

Add page

タスクが追加された時にすでに完了にしてしまった親タスクを元に戻す必要があるかもしれません。そこで、ページが追加されたときに、子タスクが追加されてしまった親タスクを完了から元に戻すようにしました。

Add page のオートメーション

このため、フィルタは先ほどの逆になります。

Add time のフィルタ

テスト実行

試しに TaskA-2 のステータスを進行中にすると、日付が設定されました。また Task A 自体も進行中になっています。

Task A-2 を進行中に変更

ここでこのタスクを完了に設定します。

Task A-2 を完了に変更

タイムラインで末端時刻範囲を使って表示すると Task A の時間は A-1, A-2 を含む範囲になっていることがわかります。

タイムラインビューで確認

おわりに

せっかくなので、日付範囲も親に反映できればと思ったのですが、現在は複数ページの更新時に更新するページ自体のプロパティは参照できないので諦めました。もう一つ Formula プロパティを設置すればできるのですが、今日は時間切れということで。

hkob.notion.site