STREAK: Как отслеживать число раз выполнения привычки подряд?

STREAK: Как отслеживать число раз выполнения привычки подряд?

Карина Артамонова

После выпуска шаблона Гибкого трекера привычек в Notion мне поступил очень интересный запрос: как отслеживать число раз выполнения привычки подряд?

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

Сhallenge accepted.


За основу я беру логику из шаблона Гибкого трекера привычек:

  • есть база с задачами на привычки:
    🔹задачам на привычки ставится дата выполнения,
    🔹привычка отмечается чекбоксом с галочкой при выполнении, а при невыполнении чекбокс остается пустым
    🔹 каждая такая задача на привычку привязана через рилейшен к виджету конкретно этой привычки


  • база виджетов привычек нужна для получения статистики по задачам на привычку:
    🔹в виджет привычки рилейшеном привязаны все задачи на эту привычку и через роллапы получаем данные о статистике выполнения привычки


Создаем 2 базы данных:

1) Привычки БД
В ней создадим 7 карточек "Бег", добавим проперти с датой выполнения и чекбокс Выполнено?
2) Виджеты БД
Тут создаем одну карточку "Виджет привычки Бег". Через двусторонний рилейшен привязываем все 7 карточек "Бега" из базы Привычки БД к созданному виджету.

Итак, мне нужно создать счетчик выполненных привычек, который обнуляется каждый раз, когда карточка "Бег" не выполнена.

Сразу понимаю, что в моей базе привычек крайними всегда будут невыполненные задачи на "Бег", так как я создаю привычки не каждый день, а сразу на месяц/неделю (как планируются привычки в моем трекере я подробно рассказываю в видео).

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

И в моем шаблоне как раз есть подходящее: визуальный индикатор в виде эмодзи цветного квадратика.

🔹если чекбокс отмечен галочкой - показывай зеленый квадратик 🟩
🔹если чекбокс пустой И дата в будущем - показывай серый квадратик ⬜
🔹если чекбокс пустой И дата в прошлом ИЛИ сегодня - показывай красный квадратик 🟥

if(prop("Выполнено?") == true, "🟩", if(prop("Дата") > now(), "⬜", "🟥"))

Чуть усложняю эту формулу: если дата выполнения привычки сегодня - показывай серый квадратик, а не красный. Для этого проверяю дату в задаче на соответствие сегодняшней дате с помощью функции now():

if(prop("Выполнено?") == true, "🟩", if(prop("Дата") > now() or formatDate(prop("Дата"), "MMM DD, YYYY") == formatDate(now(), "MMM DD, YYYY") or empty(prop("Дата")) == true, "⬜", "🟥"))


Мы будем обнулять счетчик выполненных привычек при появлении привычки с красным квадратиком, а не с пустым чекбоксом.
Ура, планирование привычек на будущее теперь никак не помешает мне считать серии выполненных привычек подряд!

Уточню, что речь именно о выполненных подряд, а не о выполненных каждый день подряд.
Если вы бегаете 3 раза в неделю: понедельник, среду и пятницу и побегали в первый раз в понедельник, то во вторник ваш счетчик не обнулится. Побегали в среду - получили 2 раза подряд на счетчике. Пропустили пятницу и... В субботу счетчик обнулился!

💪Делаю следующий шаг.

Все мои квадратики с точки зрения типа данных для формулы неразличимы - текст как текст. Чтобы иметь рычаг различия красных, зеленых и серых квадратиков создаю еще одно проперти "Символ" у задачи на привычку:

🔹если квадратик зеленый - показывай "1"
🔹если квадратик красный - показывай ":" (двоеточие - это special character, специальный символ, есть тут одна формула, которая умеет обрезать весь текст до определенного специального символа 😉)
🔹если квадратик серый - ничего не показывай, будь пустой.
В моем счетчике серии меня не интересуют серые квадратики. Только зеленые (суммируем) и красные (обнуляем).

if(prop("Цветной ярлык") == "🟩", "1", if(prop("Цветной ярлык") == "🟥", ":", ""))

С задачей на привычку мы закончили. Все дальнейшие манипуляции будут происходить с проперти у виджета привычки.


Создаем у виджета привычки роллап с получением от всех наших задач единичек и двоеточий "Роллап символов":

Нам нужно от Notion посчитать количество единиц после последнего двоеточия. Если двоеточие стоит последним, то единиц после двоеточия ноль, так и произойдет обнуление счетчика.

Создаю проперти с такой формулой, которая будет обрезать все символы из роллапа до последнего двоеточия, включая и само двоеточие. Называю проперти "Роллап подряд".

Этой формулой я говорю Notion:
Замени все символы до двоеточия на пустоту = удали все символы до двоеточия. Само двоеточие тоже удалится.

replaceAll(prop("Роллап символов"), ".*[:]", "")

Получается, в этом проперти всегда будут отображаться либо единички, либо пустота.

🔹Если последний символ - это двоеточие (= красный квадратик), Notion обрежет все, включая само последнее двоеточие - останется пустота.

Последняя привычка (за воскресенье) не выполнена
Проперти Роллап подряд пустое

🔹Если последний символ не двоеточие - то останутся все единички после последнего двоеточия. По одной единичке на зеленый квадратик. Число единичек в этом проперти и будет нашим искомым числом.

Последняя привычка (за воскресенье) выполнена
Проперти Роллап подряд показывает единичку


Теперь просто посчитаем количество символов в этом проперти: будет ноль - если проперти пустое или число количества единиц. Логично!)

😅Небольшая заминка: нам мешают запятые, через которые перечисляются значения из роллапа. Если мы будем считать символы, то запятые тоже будут учитываться, и это все сломает.

Создаю еще одно специальное проперти, которое поменяет запятые на пустоту, то есть удалит их: "Без запятых".

Сначала привожу роллап к текстовому формату функцией format() и применяю replaceAll(). Первый аргумент: где нужно поменять (отформатированное до текста проперти "Роллап подряд"), второй аргумент: что нужно поменять (запятые), а третий: на что нужно поменять (на пустоту).

replaceAll(format(prop("Роллап подряд")), ",", "")


Создаю финальное специальное проперти "Раз подряд": спокойно считаю количество символов после удаления запятых с помощью функции length(). Она и возвращает количество символов в указанном проперти.

length(prop("Без запятых"))


ИТОГО:

Получаем символ-статус задачи через роллап ➡️ обрезаем все до последнего двоеточия, включая двоеточие ➡️ убираем запятые ➡️ считаем количество единиц.
🔥 Готово!

🔥🔥🔥


Добавляю проперти-ярлык "Ярлык: серия" для вывода информации на карточку виджета:

"Делаю " + format(prop("Раз подряд")) + " раз подряд"

Итоговое отображение в Гибком трекере привычек:

🔗 СКАЧАТЬ ВЕРСИЮ ШАБЛОНА ГИБКОГО ТРЕКЕРА ПРИВЫЧЕК С ФУНКЦИЕЙ STREAK (СЕРИЯ ПОДРЯД): https://karina-art.notion.site/STREAKS-b02837ab72c642a6af37a77dffd7ee5c?pvs=4


☕ Угостить автора кофе: https://www.tinkoff.ru/rm/artamonova.karina3/RcOE898767/


Report Page