🌲

Notionツリー構造可視化の基礎技術である再帰Formula&Rollupの応用例を紹介

どうも、の熊倉(@yoshihiko_k)です。
 
今回は「Notion Community Advent Calendar 2022」の 10日目の記事です。
 
毎日投稿される記事を見ていて、色んな活用事例があり、知らなかった世界が垣間見えたりと、の掛け合わせの可能性をふつふつと感じる今日このごろです。
僕はどちらかというとNotionの専門家のため、業界専門家の方々のNotion力底上げの一助に、という観点で書かせて頂きます。
 
名だたるNotionerの皆様の記事が毎日公開されていきます。チェケラ!
名だたるNotionerの皆様の記事が毎日公開されていきます。チェケラ!
さて、昨日はつばささん(@PetsTsubasa)の『関数を駆使したタスクのツリー構造の可視化でした。
 
本記事はつばささんとの連動企画になっており、つばささんの記事はという基礎技術の基礎、本記事は応用の内容を紹介する内容になっております。
 
 
つばささんの記事と合わせて、上記youtubeを見ていただけると、本記事を味わい深く見て頂けると思います。
大変申し訳ございませんが、30〜60分ほどお時間をとって頂けると、Notion力がフリーザ並みに近付くのではないかなと思いますので、ご検討ください。
 
ここから先は、基礎をインストールして頂いた前提での紹介となります。さらっと見て興味を持って頂けましたら、つばささんの記事やYoutubeも見て頂けると有難いです。
 
それでは、よろしくお願いします。
 
ここから先はPC推奨です
 

1. 親子関係を維持したまま期間ソートを実現する

ただ単にツリー構造を作っただけでは、期間を考慮した並び替え(ソート)は出来ません。
 
そこで、円谷さんの動画でも口頭で紹介した応用例を紹介します。
まずは、動画で動きを見てみて下さい。
 
タスク名がグチャってますが、そこは一旦お気になさらず・・・
 
わかりにくいかもしれませんが、
  • 親なら親同士
  • 子なら子同士
  • 孫なら孫同士
で並び替えが行われています。
 
そのため、ツリー構造は壊れていません。
 
どんな事をしているのか、早速見てみましょう。
 

◽ 期間ソートテーブル

📌
再帰Formula&Rollupを利用しているポイント

  • をロールアップする
    • 実際の設定
      実際の設定
 

◽ 期間ソートのロジック

そもそもプログラム的に並び替えは、文字コード順に並びます。
UTF-8の文字コード表
UTF-8の文字コード表なのです。いつも検索して、よそ様のページを参照させていただいていたのですが、面倒なので自分で作りました。 perlのスクリプトでガーッと出したので、見栄えはアレですが、とりあえず。 (2018-05-10 追記) コード表を全体的に再出力しました。変更点は以下の通りです。 unicode追加面、4バイト文字の表もつくりました。 各文字ブロックにタイトルを付けました。英語タイトルはUnicode仕様書PDFへ直リンクしています。 表示されてないけど、どんな字なんだよ、と思ったらそっちを見てください。 各仕様書PDFの親ページはここ:https://unicode.org/charts/ 各文字のクリックで、クリップボードにコピーできるようにしました。 自分がフォントサイズ大きいところにコピペしてじっくり眺めたかったからですが、ついでにUTF8コード、unicode、HTML用コード(&#x~)もコピペできるようになってます。 残念ながら、スマホ等、画面の小さい環境では見づらい表になっていると思います。 面倒なので対応していません、すみません。 4バイトのところにある楔形文字の表は、横幅のでかい文字が連続しているため、PCでも横はみ出ました。格好悪いのは承知していますが、これも面倒なので放置しています、すみません。 (2016-04-09 追記) やや雑学寄りですが、 Unicodeがどんな風にUTF-8に割当てられているかのページを作成しました。 このページの最終更新日、2009-11-17でした。その頃はスルーしてたUnicodeの追加面が一般に使われているっぽい昨今、4バイト文字のページも作りたいところですね。 ところで、文字のバイト列はどのようにして出力できたのでしょうか? というお問い合わせをいただいたことがあります。 単に、unicode仕様の範囲内で1バイトずつ増やしながらループをまわして、1文字ずつ出力しただけです。 # 3バイト文字列なので、3重のループです。 foreach my $i (0xE0..0xEF) { foreach my $j (0x80..0xBF) { foreach my $k (0x80..0xBF) { # バイト列をUnicode(U)でパック print pack( 'U*', $i, $j, $k ); } } } ご参考になれば幸いです。
詳細は上のURLから確認頂けますが、1バイト文字から優先されて並び替えされます。
 
どういうこと?となる方のためにザックリ伝えると
  1. 半角記号、数字
  1. アルファベット
  1. 日本語など
の順番に並び替えられるロジックになっています。
 
このロジックを利用して、並び替え用にデータを作っているのです。
 
それでは、実際に設定している関数を見てみましょう。
 
という構文は三項演算子と呼ばれ、if関数の省略形です
実際の出力例
  • 22110100は22年11月01日00時を表したものです
  • そこにページ名を足すことで、どの親の子供なのかがプログラム的にもわかるようになります
 
先程のソートのロジックを確認してみましょう。
  1. 半角記号、数字
  1. アルファベット
  1. 日本語など
でしたね。
 
この例では先頭に同じ桁数の数字がある事で、数字の大きさの比較を第一に実現しています。
 
ファイル名の並び順を意識した時の名前の付け方をイメージするとわかりやすいかもしれません。
地味に便利なのでツリー構造を作っている方は是非実装してみて下さい。
 
 
では、続いて・・
 

2. 子の工数を親に集計させる方法

 
タスク管理をしている時に、工数を入力する場面ってありませんか?
 
全部に入力していくのは、面倒ですよね。。(マジムリ・・
 
を応用すると、末端のサブタスクに工数を入れるだけで、
自動的に親に工数の合計が集計されていく仕組みを作ることも出来ます。
 
実際に見てみましょう。
 
 

◽ 集計テーブル

見積もり工数の入力はツリーの末端(今回であれば孫のみ)だけで、
最終的に親タスクにまで工数が集計されています。
📌
再帰Formula&Rollupを利用しているポイント

  • をロールアップし合計を出す
    • 実際の設定
      実際の設定
 
 
認識しやすいように画像を作成しましたので一つずつ見ていきましょう。
 
末端である孫タスクに、工数を入力。それが関数の工数集計に計上され、それらをロールアップ_子_工数集計で集計
末端である孫タスクに、工数を入力。それが関数のに計上され、それらをロールアップで集計
_子_工数集計を読み取った工数集計 を更に親タスク側が合算
を読み取った を更に親タスク側が合算
 
 

◽ 集計用の関数

 
それでは、実際に設定している関数を見てみましょう。
 
 
このように関数自体はとてもシンプルです。
 
今までは、親をロールアップして情報が子へと伝わっていく流れでしたが、
今回は逆に子をロールアップして情報が親へと伝わっていく構造を作っています。
 
また、子の完了率を集計して、そのタスク全体の進捗率を出す。なんてのも便利かもしれませんね。
 
また実際の利用時には混乱を招かないように、見せる必要のないプロパティは非表示にしましょう。
 
 

◽おわりに

今回紹介させて頂いたようにを応用する事で、
Notionの標準機能のみで完結して、無駄をなくしたり、可視化しやすくなったりする仕組みを作り込んでいくことが可能です。
 
実際には必要となる場面は少なかったりしますが( 苦笑
いざという時にこの発想が出来ると幅が広がるかもしれませんのでぜひ挑戦してみて下さい。
 
今回の記事を見て、こんな仕組み作ったよ!という方は、是非 @yoshihiko_k に教えて頂けると嬉しいです。僕にはない発想と出会える事を楽しみにしています。
 
 
明日は りえこ専務@心を運ぶヒューマニティ経営(@rieko0510)さんの『Notionで自分の取説つくってみた』です。お楽しみに。
 
他にも再帰Formula&Rollup関連の記事がありますので、もしよろしければご参考下さい。
ありがとうございました!