Экспорт задач из notion в любой календарь

Всем доброго времени суток! Продолжаю делать материалы по автоматизации каких-либо процессов нашей с вами жизни. Сегодня поговорим о том, как сделать экспорт задач/событий из notion в любой онлайн календарь (Google календарь и прочее).

Для начала поясню зачем это нужно. Я пользуюсь Notion в очень большом количестве кейсов. Я уже писал несколько постов про это здесь и стараюсь их пополнять. Нет давно я начал вести все свои созвоны внутри Notion в виде календаря.

База созвонов

Что из себя представляет база созвонов — обычный Calendar View в базе данных. В качестве каждой сущности — созвон. Когда созвон проходит, то в эту сущность добавляется запись разговора и, если надо, мой сотрудник делает расшифровку созвона.

Инструмент работает прекрасно. Особенно когда я нанял человека, который фиксирует мои созвоны и договоренности созданные на них. Я всегда могу вернуться назад и вспомнить о чем говорил по заметкам или послушать запись разговора. Но сегодня речь не о том как именно у меня построена система созвонов, а о том как я автоматизировал еще один свой процесс.

Проблема и способ решения

Суть проблемы проста — у Notion классная возможность структурировать информацию, но система уведомлений не самая удачная, т.к. нормально оповещения работают только через мобильное приложение. А мне бы очень хотелось некоторые базы данных (например ту же систему созвонов) видеть в своем календаре, куда добавляются разные мероприятия и хотелось бы видеть все "воедино".

Но тут на помощь приходит Notion API, который развивается достаточно регулярно. Также моим помощником, как обычно, является Javascript, на котором я написал короткий скрипт, который извлекает из Notion все созвоны и формирует ics файл на лету, который импортируется в Google Calendar и, в конечном итоге, созвоны удобно размещаются в мой календарь вместе со всеми остальными событиям.

Реализация желаемого

Для начала нужно подключиться к самому API. как это сделать я писал здесь. В ответ мы получаем NOTION_TOKEN, который нужно добавить к базе данных наших созвонов также как пользователя. После этого любой скрипт, который будет подключаться вместе с этим токеном, будет иметь доступ к этой базе данных.

Далее необходимо создать саму базу данных, в которой будет реализовано представление в виде календаря. Для этого достаточно прост создать пустую страницу и нажать Create database вместе с Calendar View. Или же, например, взять мой шаблон и скопировать его уже куда нужно внутри вашего Notion.

Далее необходимо разработать следующую логику:

  1. Забор всех элементов из выбранной базы данных
  2. Выбор элементов с проставленной датой (в Notion можно создать "No date" страницу)
  3. Сформировать массив элементов, готовых для создания ics
  4. Создать сам ics
  5. Импортировать его в наш календарь

Как обычно, потратив пару часов вечером, я собрал "на коленке" решение, которое реализует мои потребности и развернул его на сервере. Несколько месяцев решение работало отлично и я решил поделиться им с сообществом. Так и родился небольшой npm пакет - notion-calendar-integration. Теперь сделать подобную интеграцию можно за считанные минуты.

Простой пример получения ics файла

Ниже представлен простой скрипт, который, используя мой пакет, создает ics файл в той папке, где был запущен скрипт:

const { createIcsString } = require('notion-calendar-integration')
const fs = require('fs')
createIcsString(process.env.NOTION_TOKEN, process.env.CALENDAR_DB, {
  date: process.env.DATE_PROPERTY_NAME || 'Date',
  info: process.env.INFO_PROPERTY_NAME || 'Info'
}).then(str => {
  fs.writeFileSync('events.ics', str)
})

Для того, чтобы этот скрипт заработал необходимо указать следующие переменные окружения:

NOTION_TOKEN - токен авторизации
CALENDAR_DB - id базы данных, где есть представление в виде календаря
DATE_PROPERTY_NAME - Название property, по которому строится сам календарь
INFO_PROPERTY_NAME - Название property, в котором лежит "доп информация" для отображения в описании календаря

После запуска скрипта, вы получится файл ics, который можно добавить в ваш календарь через импорт, но настоящее удобство и автоматизация представлена ниже

Автоматическая синхронизация

Создавать каждый раз файл руками и заливать в календарь подходит для примера использования, но не подходит для реальной жизни. Для того, чтобы данные подтягивались автоматически, необходимо запустить небольшой http сервер, который будет отдавать этот ics по запросу. Пример такой реализации можно увидеть среди моих примеров в Github репозитории пакета. Запустив такой небольшой сервис, вы сможете импортировать этот календарь через URL и теперь синхронизация будет происходить автоматически.

Очень и очень буду признателен, если найденные ошибки в моем пакете будут доходить до меня в виде issue или сообщения в личку. Спасибо!

Я недавно открыл для себя классный инструмент для таких вещей — Pipedream. Такие простые скрипты можно смело делегировать ему и не следить за работой сервера и тд. Этот же пример, например, я выложил в открытый доступ на этой платформе. Вы можете скопировать его, указать свои переменные окружения и по ссылке, сразу же, начнет открываться ваш ics, который вы можете добавить в ваш календарь.

Итоговый результат

В конечном итоге я получил достаточно удобный инструмент для организации своих созвонов. У меня есть люди, которые помогают мне вести мои разные проекты и процессы. И, теперь, когда необходимо устроить со мной какой-либо созвон, мой коллега может сам создать сущность созвона в этой БД и туда же записать информацию по итогам созвона.

Получается почти как обычный календарь, который обычно ведут личные ассистенты, но с бОльшим функционалом, возможностью сохранить резюме созвона со всеми удобствами Notion и, например, дать доступ к этому резюме созвона клиенту, с которым общались.