Рекурсия в Notion: полный путь до потомка

Рекурсия в Notion
Фото – created by kjpargeter – www.freepik.com

Как вы знаете, в Notion базы данных могут устанавливать связи сами с собой, через Relation. Это позволяет задавать иерархии ваших элементов. В самом простом случае это связки типа “задача-проект” или “задача-проект-направление”.

Но встречаются и более усложненные структуры. Например, в сеттинге GTD используется сразу 6 уровней — так называемых горизонтов фокуса:

  • Текущие действия
  • Проекты
  • Зоны ответственности и внимания
  • Цели
  • Видение
  • Миссия и принципы

Можно вообще превратить таблицу Notion в подобие mind-карты. При таком подходе длина цепочки может быть сколь угодно большой. Правда, сам Notion программно ограничивает возможное количество уровней, об этом поговорим далее.

👉

Две основные задачи:

  1. Как получить в текстовом виде полный путь от начала до любого элемента?
  2. Как подсчитать уровень вложенности?

Первое поможет нам сориентироваться, к чему принадлежит тот или иной элемент (особенно при использовании API). А уровень вложенности позволит легко фильтровать — показать все “зоны ответственности” в GTD, например.

Чтобы решить обе задачи, мы воспользуемся довольно экзотическим трюком: заставим два свойства ссылаться друг на друга. Давайте посмотрим на примере.

Создание связей

Допустим, мы создаем таблицу с нашими сферами интереса и сейчас прорабатываем всё, связанное с музыкой

Здесь я поместил строчку “Начало” по аналогии со стартовым узлом в mind-картах. Это будет 1-й уровень. Теперь надо связать последующий слой с предыдущим, например, музыка — это одно из наших хобби. Для этого заведем Relation таблицы на неё же, с синхронизацией.

Создаем взаимосвязанные свойства

Теперь добавим два свойства, которые и будем завязывать друг на друге. Для начала сделаем их просто текстовыми. Если сразу попробовать ставить роллапы и формулы, связка может не сработать.

Теперь превращаем “Свой путь” в формулу и вносим такой текст:

if(not empty(prop("Путь предыдущего")), prop("Путь предыдущего") + " / ", "") + prop("Тема")

Что делает эта формула? Она составляет путь к текущей строке, опираясь на путь к “родителю”. Если у родителя что-то записано, то она добавляет “/” и свое название. Если же у родителя пусто (это самый первый элемент), то для него пишется название без “/”.

В свою очередь, в “Путь предыдущего” мы через роллап заложим “Свой путь”, но для предыдущего элемента😀.

В результате получаем:

Максимальный уровень вложенности

Обратите внимание, что разработчики намеренно ограничили действие рекурсивных формул, чтобы не допустить возникновение бесконечных циклов. 7 уровней — такова максимальная глубина вложенности.

Теперь давайте создадим два текстовых поля “Уровень предыдущего” и “Свой уровень”. Последний превращаем в формулу:

toNumber(prop("Уровень предыдущего")) + 1

А свойство “Уровень предыдущего” превращаем в роллап:

Окончательно получаем такой вид:

Хоть я и рекомендую самому поупражняться в этих техниках, вы можете использовать шаблон по ссылке.

Стань мастером с курсом по Notion

Исчерпывающий функционал, 200+ задач, шкала прогресса по разделам и курсу, шаблоны, описание формул, красивый домен для ваших страниц