Формулы и роллапы в Notion: продвинутое руководство с примерами
Продвинутое3 минРедакция Innovialabs
Коротко
Формула вычисляет значение внутри одной записи, роллап собирает и агрегирует данные из связанных записей; вместе они дают в Notion автоматические сроки, прогресс проектов и остаток бюджета без ручных подсчётов.
Главное
- Formula — свойство, которое вычисляет значение по другим свойствам этой же записи: текст, число, дату, флажок.
- Rollup — свойство, которое через relation берёт значения из связанных записей и агрегирует их: сумма, количество, процент, самая поздняя дата.
Типичная связка: relation «Проект → Задачи», роллап считает долю выполненных задач, формула превращает её в прогресс-бар.
Синтаксис формул
Свойства вызываются через prop("Имя"). Поддерживаются операторы + - * /, сравнения == != > <, логика and, or, not и точечная запись методов.
prop("Цена") * prop("Количество")
prop("Название") + " — " + prop("Клиент")
prop("Теги").length()
Полезные функции:
| Функция | Что делает |
|---|---|
if(условие, да, нет) | Условие с двумя ветками |
ifs(у1, з1, у2, з2, иначе) | Цепочка условий без вложенных if |
empty(x) | Проверка на пустое значение |
let(имя, значение, выражение) | Переменная внутри формулы |
format(x) | Превращает число или дату в текст |
round(x), abs(x) | Округление и модуль |
Для читаемости разбивайте длинные формулы на строки — редактор формул это позволяет.
Даты
now()— текущие дата и время,today()— сегодняшняя дата.dateBetween(дата1, дата2, "days")— разницадата1 − дата2в днях, неделях, месяцах.dateAdd(дата, 14, "days")иdateSubtract(...)— сдвиг даты.dateStart(...)иdateEnd(...)— начало и конец диапазона дат.formatDate(дата, "DD.MM.YYYY")— вывод в нужном формате.
Пример: дата следующей проверки документа через 90 дней после последней.
dateAdd(prop("Проверено"), 90, "days")
Роллапы через relations
Чтобы создать роллап:
- Убедитесь, что есть relation на нужную базу.
- Добавьте свойство Rollup и выберите relation.
- Выберите свойство связанной базы и способ расчёта.
Варианты расчёта: показать исходные значения, Count all, Count values, Sum, Average, Min / Max, Earliest / Latest date, Percent checked для чекбоксов, проценты по группам статуса.
Примеры:
- В «Проектах»: сумма часов по задачам, самая поздняя дата задачи, процент выполненных.
- В «Клиентах»: сумма всех счетов, дата последней сделки.
Формулы также умеют работать со связями напрямую: prop("Задачи") возвращает список страниц, к которому применимы filter, map и length.
Готовые формулы
Статус срока
Показывает «Просрочено», «Сегодня» или сколько дней осталось. Нужны свойства Срок (Date) и Статус (Status).
if(empty(prop("Срок")) or prop("Статус") == "Готово", "",
let(d, dateBetween(prop("Срок"), today(), "days"),
ifs(
d < 0, "Просрочено на " + format(abs(d)) + " дн.",
d == 0, "Сегодня",
"Осталось " + format(d) + " дн."
)
)
)
Прогресс по задачам проекта
Доля выполненных задач от 0 до 1 прямо по relation, без отдельного роллапа:
let(t, prop("Задачи"),
if(t.length() == 0, 0,
t.filter(current.prop("Статус") == "Готово").length() / t.length()
)
)
Задайте формату числа отображение в процентах.
Прогресс-бар
Берёт число от 0 до 1 из свойства Прогресс и рисует шкалу из десяти делений:
let(p, round(prop("Прогресс") * 10),
repeat("●", p) + repeat("○", 10 - p) + " " +
format(round(prop("Прогресс") * 100)) + "%"
)
Остаток бюджета
Потрачено — роллап Sum по сумме расходов из связанной базы, Бюджет — число.
if(empty(prop("Бюджет")) or prop("Бюджет") == 0, "Бюджет не задан",
let(left, prop("Бюджет") - prop("Потрачено"),
if(left < 0,
"Перерасход: " + format(abs(left)),
format(round(prop("Потрачено") / prop("Бюджет") * 100)) + "% израсходовано"
)
)
)
Частые ошибки
- Деление на ноль — всегда проверяйте знаменатель через
if. - Сравнение с переименованным статусом — формула ищет точное значение. Переименовали «Готово» — обновите формулы.
- Смешение типов — нельзя сложить текст с числом без
format(). - Длинные цепочки роллапов и формул через несколько баз работают медленнее и сложнее в отладке. Если расчёт становится похож на финансовую модель, его место в таблице или BI.