Notion でサブアイテムを子孫まで含めて集計する

2023/02/21に公開

Leaner 開発チームの黒曜(@kokuyouwind)です。

以前 Notion でボードゲーム部のページを作った話を書きましたが、今回はサブアイテム機能を試して集計についてのハックを見つけたのでまとめます。

https://zenn.dev/leaner_dev/articles/20221031-boardgame-club-notion

Notion のサブアイテム機能で親子関係を管理する

昨年 12 月の Notion アップデートで、サブアイテム機能 が利用できるようになりました。[1]

これはデータベース内のアイテム間に親子関係を作れる機能です。この機能を有効にすると「親アイテムを表すカラム」と「子アイテムの集合を表すカラム」の 2 つがデータベースに追加されます。

たとえば、親子関係のあるプロジェクトデータベースは以下のようになります。

プロジェクト A には子として 子プロジェクト A-1子プロジェクト A-2 が紐付いています。また 子プロジェクト A-1 には更に子として 孫プロジェクト A-1-i孫プロジェクト A-1-ii が紐付いています。

このように、多段ネストした関係を単独のデータベースで表せるのがサブアイテム機能の特徴です。

Rollup でサブアイテムに関する集計を行う

サブアイテム機能で作られる「親アイテムを表すカラム」と「子アイテムの集合を表すカラム」は、いずれも Relation カラム扱いになるため Rollup の対象にできます。

さきほどのプロジェクトデータベースで「子プロジェクトの数」が必要になった場合は、 Rollup カラムを作り「子プロジェクトカラム」の Count に設定すれば取得できます。

このように設定すると、「子プロジェクト数」カラムに子プロジェクト数が正しく計算されます。

孫プロジェクトを含めた集計を行う

ところで、 プロジェクト A は子プロジェクトだけでなく孫プロジェクトを持っています。このため、 プロジェクト A の子孫プロジェクトは以下の 4 つがあることになります。

  • 子プロジェクト A-1
  • 孫プロジェクト A-1-i
  • 孫プロジェクト A-1-ii
  • 子プロジェクト A-2

このように「子孫プロジェクト数」を数えるとき、素朴に考えると「子プロジェクト」に対する Rollup で「子プロジェクト数」の Sum を取ればうまく計算できそうな気がします。[2]

しかしながら、 Notion の制限により Rollup 時の対象カラムとして他の Rollup カラムを選ぶことはできません。今回の例では、対象カラムの選択肢に「子プロジェクト数」カラムが表示されず選択できません。

ではこのような計算が不可能かというと、抜け道が存在します。Rollup 対象カラムには Formula が指定可能なので、単に Rollup カラムの値をそのまま計算する Formula カラムを作ることで集計できるのです。

今回であれば、「子プロジェクト数」カラムの値をそのまま表現する「子プロジェクト数_bridge」Formula カラムを作成しておきます。

そして Rollup カラムでは「子プロジェクト」を対象に「子プロジェクト数_bridge」カラムの Sum を集計します。

このようにすれば、「子プロジェクト数」と「孫以下のプロジェクト数」を足し合わせて「子孫プロジェクト数」を計算できます。

プロジェクト A の「子孫プロジェクト数」が正しく 4 になっているのが確認できますね。

子孫を含めた集計を正しく行う

前述の内容で一見「子孫プロジェクトの集計」が正しく行えたように見えましたが、ひ孫要素も作ってもう少し検証してみましょう。

孫プロジェクト A-1-i の子供にひ孫となるプロジェクトを 2 つ追加しましたが、 プロジェクト A の「子孫プロジェクト数」は 4 のままになっています。これは修正したいところですね。

ここで、発想を変えて「自身を含む子孫プロジェクト数」を考えてみます。

  • 子プロジェクトがないとき、「自身を含む子孫プロジェクト数」は自身のみなので 1
  • 子プロジェクトがあるとき、「自身を含む子孫プロジェクト数」は子プロジェクトの「自身を含む子孫プロジェクト数」の合計に 1 を足したもの

このように考えると、実は計算に必要なカラムは以下の 2 つで十分なことがわかります。

  • 子プロジェクトの「自身を含む子孫プロジェクト数」を集計するための Rollup カラム
  • 集計した Rollup カラムに 1 を加算するための Formula カラム

Rollup カラムと Formula カラムで相互再帰するイメージですね。[3]これに沿ってカラムを設定すると、以下のように「子孫プロジェクト数」が正しく計算できます。

まとめ

Notion のサブアイテムを子孫まで含めて集計する方法についてまとめました。

最後の例のように「自身を含めた値を計算する Formula カラム」を作り、 Rollup でそれを集計するという戦略は応用の幅が広そうです。例えば「サブプロジェクトを含めた見積日数の合計を計算する」「タスクの依存関係を元にクリティカルパスを算出し、完了予定日を計算する」などができそうですね。

また Rollup カラムを Formula カラム経由でさらに Rollup するテクニックは、サブアイテムに限らず一般の Relation でも利用できます。 今回はプロジェクト自体の数を数えましたが、プロジェクトと粒度を分けてタスクデータベースを作りたいケースも考えられます。このときに各プロジェクトでは子タスク数を算出した上で、更に親プロジェクトはすべての子孫プロジェクトの子タスク数を算出するといったことが可能です。

Rollup カラムを直接 Rollup できない制限に困っていた人はぜひ試してみてください。

脚注
  1. ヘルプページでは「サブタスク」と表現されていますが、この記事ではNotion内表現に従い「サブアイテム」と呼びます。 ↩︎

  2. 実際には自身の子プロジェクト数を足し合わせる必要があるため、最初から Formula を噛ませたほうが早いです。今回は説明の展開上見逃してください。 ↩︎

  3. サブアイテムに関する Rollup では必ず 1 レベル低い要素が処理され、 Formula では同一レベルに処理が閉じているため、この相互再帰はサブアイテムを持たないアイテムを基底として必ず収束します。 ↩︎

リーナーテックブログ

Discussion