Як налаштувати зручну синхронізацію між Notion та календарем через ICS на JS без сервера
Вже майже 2 роки я активно використовую Notion у своєму житті. Я регулярно поповнюю його своїми особистими автоматизаціями, які полегшують життя мені та моїй команді. Іноді я публікую у своєму блозі різні кейси, які вдається оформити у вигляді бібліотеки або прикладу коду. Цей пост також доступний у форматі відео на моєму каналі.
Сьогодні я вирішив поділитися тим, як я інтегрував календар з Notion у Google Calendar через ics. У такий спосіб події з календаря Notion можна додати до будь-якого календаря, який підтримує ics формат (тобто, практично, будь-який)
Трохи передісторії
Зазвичай необхідність і суть будь-якої інтеграції та/або автоматизації простіше зрозуміти, якщо зрозуміти навіщо саме її було створено. Якщо хочете перейти, без передісторій, одразу до техніки, гортайте вниз до заголовка "Реалізація".
Наразі процес спілкування з новими запитами до мене чи моєї компанії відбувається через мого Telegram бота чи помічника. Але так воно працює лише останній рік.
Як воно працювало раніше
Запит може бути будь-яким – можуть почати пропонувати якісь “проривні маркетингові” послуги моєї компанії, звернутися до мене за платними консультаціями, запропонувати виступити на якійсь конференції тощо.
Я намагався вносити все у свій гугл-календар. Ключове слово – старався. Іноді мене навіть вистачало на цілий тиждень стабільних перемог над моєю лінощами в цьому питанні. Поразка у цій сутичці закінчувалися накладками у дзвонах та втратою репутації.
Мені досить швидко набридло обробляти таке самому. У результаті почав упорядковувати це.Серед наших клієнтів є серйозні люди, у яких є помічники і всі вони, як один, ведуть їхній календар з усіма зустрічами та дзвонами. Вирішив не вигадувати велосипед і зробити те саме.
Причому я відразу вирішив йти не шляхом надання доступу до гугл-календарю. Я хотів, щоб я міг підв'язувати свої завдання та нотатки з мого Notion. Тому дзвінки я вирішив зберігати там же. Я створив базу в Notion з поданням (view) "календар" і дав йому доступ на внесення змін.
У момент, коли приходить розуміння, що необхідно влаштувати дзвінок створюється (мною, ботом чи помічником) сутність у Notion. Як велася моя база дзвонів у травні 2022 року:
- Вказується дата та час дзвону;
- У назву зазвичай пишеться ім'я прізвище людини і компанії для ідентифікації в майбутньому;
- У полі Info додається інформація, необхідна для відображення всередині сповіщення в Telegram боті. Зазвичай тут короткий опис про що планується розмова;
- У тіло вже розміщується інформація будь-якого роду. Зазвичай помічник, після дзвінка, пише розшифровки, домовленості та деталі, які можуть бути корисними у майбутньому.
Бажаний функціонал
Мене все влаштовувало крім того, що для перегляду всіх дзвонів було необхідно йти в notion і дивитися, що у мене за планами наступного дня. Додаток Notion на Android працює вкрай повільно і я вирішив зробити так, щоб усі дзвінки з'являлися всередині мого календаря, який я вів і веду у своїх особистих справах.
Тобто хотілося, щоб я/бот/помічник вносив інформацію тільки до Notion і щоб тільки Notion був єдиним джерелом інформації для всіх. Що ще важливіше — люди досить мінливі і іноді дзвінки переносяться ще до початку.Важливо, щоб можна було посунути картку в Notion і все стало на свої місця.
Реалізація
Перше що мені спало на думку для реалізації функціоналу — відправляти події через Google Calendar Api. Я навіть встиг прочитати їхню Api Reference і приблизно накидати ідею як створювати події та відстежувати їхню синхронізацію. Наступним етапом були розбірки з джерелом даних - я взявся дивитися що вміє Notion Api і був засмучений.
Складнощі на боці Notion
Робота з Notion відбувається лише через request-response підхід. Тобто нам, для отримання інформації та оновлень, потрібно щоразу забирати до себе всю інформацію і вже на своєму боці розуміти, що змінилося, а що ні, і реагувати на зміни.
Процес актуалізації довелося б робити так:
- Потрібно проходити по всіх елементах бази дзвонів та шукати зміни;
- Якщо додали поле, треба робити на N разів більше перевірок (N – кількість созвонов у базі);
- Згодом база дзвонів зростає (1-2 дзвони на день) = час обробки теж;
- Достатньо важко підтримувати стабільну роботу.
На превеликий жаль, на момент написання посту, Notion зовсім не вміє в webhook. В ідеалі було б підписатися на якісь оновлення та щоб Notion сповіщав наш сервер про кожну зміну на своїй стороні.
Webhook - досить поширена практика у світі CRM та інших сервісів, але Notion поки її не освоїв (на момент написання цього посту). Сподіваюся, що незабаром такий функціонал порадує розробників. Ну а поки довелося вирішити завдання трохи більш лакончино
Знайдене рішення. Генерація ics на nodejs
Загалом я подивився на цей майбутній челлендж з API і залишив цю ідею до кращих часів, які настали через кілька місяців. Я зрозумів, що я можу експортувати всі елементи з Notion в ics, віддавати це через express і відразу імпортувати в Google Calendar як сторонній календар.
Насамперед необхідно отримати notion token. Довго на цьому зупинятись не буду. описував це у своєму блозі. Після отримання токена потрібно створити базу даних із Calendar View — можна взяти мій шаблон. Після створення бази фіксуємо database_id із посилання. Їм закінчується посилання перед початком query_string (Перед знаком питання).
Отримання даних з Notion
Далі приходимо безпосередньо до реалізації. Усередині коду використовуються змінні notionToken і calendarDb - це саме токен і id бази даних відповідно.
const notion = new Client(< auth: notionToken, >); const Events = await notion.databases.query(< database_id: calendarDb, >);
З notion приходить об'єкт, що містить всі елементи цієї бази даних. Нам для заповнення гугл-календаря потрібні такі поля:
- Event.properties['Name']['title'][0]?.['text']['content'] — назва події
- Event.properties['Info']['rich_text'][0]?.['text']['content'] — короткий опис події
- Event.properties['Date'] - власне дата події.
Із полем дати події є деякі особливості:
- Є поля start та end.
- Якщо не поставити end то в ньому буде null
- Якщо поставити, в інтерфейсі Notion, прапорець "Include time" то формат дати зміниться, але буде писатися в тому ж полі - треба дивитися на довжину цього поля і тоді можна зрозуміти, чи ввімкнено час.
- Якщо в нас включено час, то end також може бути порожнім і, отже, треба до часу початку додавати годину, якщо не вказано час закінчення.
Всі ці кейси нічого складного не уявляють, але вони пізнаються “в біді”. Тобто спочатку налаштував систему лише для роботи з днями, запустив та залишив. Проходить час і випадково в одному місці ставиш дату з часом і все система зламалася. Я всі ці кейси обробив. Вийшло досить милице, але завдання поставлене вирішує.
Формування ICS
Після отримання масиву об'єктів із Notion їх необхідно привести до формату, який можна конвертувати в ics. Саме формування ics рядка реалізовано в однойменному пакеті npm.
Отримати ics з масиву подій можна так:
const icsEvent = ics.createEvents(Events) if (icsEvent.error) < console.error(icsEvent.error) return >icsEvent.value // кінцевий рядок ics
Масив Events є масивом з наступних елементів:
Далі вже справа техніки: передати цей рядок у express (або будь-який інший http) сервер і передати посилання на Google Calendar
Після чого Google Calendar сам зайде за посиланням, викачає всі події та додасть їх до мого календаря. Все працює більш ніж стабільно і події з'являються в календарі не більше, ніж через 10 хвилин після додавання в Notion.
Якщо я раптом чогось поміняю в одній події, то при наступному закачуванні вся інформація актуалізується і в календарі.
Щоб не тримати сервер під таку дрібницю, я розмістив цей простий скрипт на pipedream. Можете брати до себе, в змінних env вказувати свої токен і id бази даних і додавати в календар посилання.
Також зробив невеликий npm пакет, де всі "костилізації" з датами сховав в одному методі createIcsString , який на вхід приймає токен та id бази даних (приклади оформив окремо).
15 лайфхаків Notion — для роботи, бізнесу та повсякденних завдань
Донедавна сервіс Notion використовували стартапи та невеликі команди для роботи над своїми проектами. Але з переходом на віддалення його освоїли і більші бізнеси. Розповідаємо, що корисного там можна знайти
Що таке Notion і для чого він потрібний?
Notion — модульне рішення, яке допомагає керувати завданнями та проектами, збираючи в одному місці всі потрібні посилання, файли та документи. У сервісу є платна та безкоштовна версії. Перша коштує від $5 до $10 на місяць і відрізняється розширеним набором функцій та обсягом сховища. Працює як додаток на смартфоні або комп'ютері, а також онлайн, у веб-браузері. Notion містить у собі нотатки, таск-менеджер, органайзер та творчу майстерню. Він особливо зручний, якщо вам доводиться працювати з різними форматами файлів та документів – їх можна поєднати в один проект. Усередині є робочий простір, де можна створювати сторінки з вкладеннями, бічна панель (сайдбар) із деревом сторінок, основне поле для створення та редагування блоків.
Що можна робити за допомогою Notion
- Працювати з текстами, використовуючи різні шрифти та заголовки, буліти, колірні маркери, виділення цитат, наклейки.
- Працювати з даними за допомогою таблиць, формул, календарів та списків.
Головна особливість сервісу в тому, що він складається з окремих модулів, які потрібно збирати та налаштовувати під себе. На це піде якийсь час, зате в результаті ви отримаєте універсальний робочий інструмент замість CRM або десятка додатків та онлайн-сервісів.
Кому підійде Notion?
- Кожному для особистих справ: щоб складати повсякденні списки, не пропускати важливих зустрічей, ставити довгострокові та короткострокові цілі.
- Редакторам: щоб збирати контент для випуску, розподіляти завдання між авторами та фотографами, відстежувати статус та термін здачі матеріалів.
- Дизайнерам та розробникам: щоб збирати брифи, референси, файли та всі етапи проекту, ставити завдання та контролювати терміни.
- HR-фахівцям: щоб збирати резюме, портфоліо та тестові завдання від претендентів, розкладати їх по етапах, складати графік співбесід, стежити за розміщенням оголошень та вакансіях.
- SMM: щоб складати контент-плани та графіки виходу постів, ставити завдання підрядникам та аналізувати охоплення публікацій.
- Студентам та викладачам: щоб викладати навчальні матеріали та лекції, стежити за розкладом, призначати зустрічі та вебінари, надсилати роботи на перевірку.
Плюси та мінуси Notion
💡 Плюси:
- Універсальність: є 20 готових шаблонів – дошки, журнали, чек-листи, галереї – з яких можна зібрати свій проект із потрібними інструментами.
- Зручний для роботи в команді: можна редагувати документи та завдання колективно в режимі онлайн та створювати дискусії. При цьому в коментарях можна згадувати членів команди, щоб вони отримували сповіщення.
- Легко переносити дані з Trello, Evernote Google Docs (у верхньому правому меню «…» → Import → вибираємо потрібний сервіс).
💣 Мінуси:
- Складно розібратися новачкові: багато функцій, блоків та шаблонів, які потрібно збирати та налаштовувати.
- Таблиці для фінансів не такі багатофункціональні, як Google.
- Немає багатьох функцій CRM: наприклад, синхронізації з ВАТС, внутрішньої аналітики, інтеграції з корпоративними сервісами.
- Обмеження у безкоштовній версії.
- Інтерфейс працює поки лише англійською чи корейською мовами.
Лайфхаки для легкої та швидкої роботи у Notion
💌 Імпорт файлів
На панелі зліва (сайдбар) натисніть Import, потім у випадаючому вікні виберіть програму, з якої хочете імпортувати файли. Якщо це Evernote, Google Docs, Trello або Asana, потрібно спочатку увійти в обліковий запис і підтвердити доступ для Notion.
Так виглядає меню імпорту файлів з інших програм. Можна переносити документи, фото та відео, таблиці та навіть пости із соцмереж
📅 Додайте дату
Підійде тим, хто працює з документами, які проходять багато правок. Відкрийте блок, внизу введіть «/date», натисніть введення і введіть потрібну дату. Це дозволяє відстежувати всі версії блоків та документів, переходячи до потрібної — зручніше, ніж історія версій у Google Docs.
Приклад команди з використанням косої межі в Notion. В даному випадку – проставлення дати
🖥️ Використовуйте блоки з кодом
Підійде розробникам та тим, хто працює з ними в команді. Введіть "/code" в кінці блоку, і у вікні додайте програмний код.
🌈 Позначте блоки різними кольорами
Ця функція є аналогом кольорових міток в Trello. Вона допомагає сортувати завдання за етапами та виконавцями. Введіть "/color" в кінці блоку та виберіть потрібний колір. Можна виділяти кольором текст або тло, щоб позначити фрагменти документа.
👀 Вставляйте посилання на пости у соцмережах, фото та відео
Ця функція дозволить додати текст, фото або відео прямо до блоку, щоб не потрібно переходити за посиланнями. Наберіть в кінці блоку /Video, щоб вставити відео з YouTube або Vimeo і /tweet для вставки посту з Twitter.
📁 Додайте файли з Google Drive та Google Maps
Наберіть внизу блоку "/google" і виберіть у випадаючому меню Google Drive або Google Maps. Так ви зможете прикріпити документи, файли, маршрути чи адресу точки на карті.
🔮 Виберіть потрібний колір теми
Зайдіть в налаштування (Settings) в сайдбарі, виберіть Appearance і тему - Light або Dark. Також можна використовувати комбінацію клавіш Command + Shift + L або D (macOS) та Ctrl + Shift + L або D (Windows) для перемикання між світлою та темною темами.
🔔 Додайте нагадування
Це зручно, коли ви працюєте з безліччю завдань і хочете відстежувати дедлайн. Введіть внизу блоку /remind і додайте дату і час, щоб отримати нагадування.
🧑🤝🧑 Керуйте проектами та командою
У Notion ви можете використовувати шаблон Roadmap, щоб користуватися тими самими функціями, що у Trello.
Програму можна "об'єднати" з груповим чатом у Slack, щоб ви могли обговорювати всі зміни в проекті, обмінюючись даними та файлами з Notion. Для цього натисніть Updates у верхньому правому кутку програми та Connect Slack Channel у випадаючому меню.
✈️ Плануйте поїздки та подорожі
У шаблоні Travel Plans (вкладка Templates у лівому меню, знизу) зручно складати плани поїздок за датами та маршрутами (через інтеграцію з Google Maps), прикладати квитки та броні, вести облік витрат для всіх учасників подорожі.
🖌️ Плануйте проект у UI/UX-дизайні
Для дизайнерів у Notion є підтримка популярних платформ та додатків. Наприклад, до кінця блоку можна додати інтеграцію: «/Figma» або «/Invisinon» — для відповідних сервісів. Так ви зможете додавати в проект усі деталі, описи та макети.
☠️ Заблокуйте сторінку
Ви можете заблокувати блок або сторінку проекту, щоб вимкнути можливість редагування.Для цього натисніть «…» у верхньому правому кутку та виберіть Database lock.
📤 Експортуйте файли
Вивантажуйте файли HTML, Markdown, PDF та CSV-таблиці. Для цього натисніть у верхньому правому меню «…», потім — Export, далі виберіть потрібний формат.
🌍 Відкрийте публічний доступ до сторінки
Натисніть Share у верхньому правому кутку програми, виберіть Share to web і Allow duplicate as template. Тепер ви можете надіслати посилання на сторінку, а будь-який із членів команди зможе скопіювати її, разом із завданнями та файлами.
💸 Заощаджуйте на оплаті
У Notion можна зменшити плату за тарифом, якщо скористатися спеціальними опціями. Зайдіть у Settings → Earn Credits: тут відображається сума на вашому рахунку. Її можна поповнити:
- на $5 — за кожну авторизацію в десктопній, браузерній та мобільній версіях, а також за імпорт даних з Evernote;
- на $3 — за встановлення розширення Web Clipper у браузері Chrome та збереження посилання через нього, а також через меню «Поділитися» в мобільній версії.
Усі зароблені кошти можна витратити на часткову або повну оплату вашого облікового запису. Вивести їх на рахунок не вдасться.