Календарь и утренний брифинг в 8:00

Первое, что делает хороший помощник утром, — говорит, что у вас сегодня. Без этого день начинается с открытия трёх приложений. В этом уроке соберём сценарий, который в 8:00 по будням сам смотрит в календарь и присылает встречи в Telegram. Это основа брифинга: в следующих уроках мы добавим в него почту и задачи.

Чему научитесь в этом уроке:
• подключить Яндекс Календарь к n8n по ссылке;
• оставить только встречи на сегодня с учётом часового пояса;
• запустить сценарий по расписанию и проверить его вручную.

Как будет устроен сценарий

Вспомните схему процесса из урока 1.4: триггер, шаги, результат. Здесь она такая:

  1. Расписание будит сценарий в 8:00 по будням.
  2. HTTP Request скачивает календарь по ссылке. Это тот же файл, который вы скачали бы, открыв ссылку в браузере.
  3. Code находит в файле встречи на сегодня.
  4. Basic LLM Chain с моделью из урока 2.3 пишет короткую сводку.
  5. Telegram отправляет её вам.

Шаг 1. Ссылка на календарь

В Яндекс Календаре наведите курсор на календарь «Тест-ассистент» в списке слева, нажмите на шестерёнку и откройте раздел экспорта. Скопируйте ссылку в формате iCal (заканчивается на .ics). Помните предупреждение из прошлого урока: эта ссылка работает как пароль.

Шаг 2. Скачиваем календарь

Создайте в n8n новый сценарий и назовите его «Утренний брифинг». Добавьте узел Manual Trigger («запуск вручную»): с ним удобно проверять, расписание добавим в конце. После него добавьте узел HTTP Request:

  • Method: GET;
  • URL: ваша ссылка iCal;
  • в Options → Response → Response Format выберите Text. Иначе n8n попытается прочитать календарь как таблицу и выдаст ошибку.

Нажмите Execute step. На выходе появится одно поле data с длинным текстом, где события начинаются со строки BEGIN:VEVENT. Так календарь выглядит изнутри.

Шаг 3. Оставляем встречи на сегодня

Добавьте узел Code и назовите его «Встречи на сегодня»: дальше мы будем обращаться к нему по имени. Вставьте код целиком. Программировать не нужно: код разбирает файл календаря на встречи, оставляет сегодняшние по московскому времени и сортирует их. Если встреч нет, он возвращает строку «Встреч нет», чтобы брифинг не молчал в свободный день.

// Разбираем файл календаря и оставляем только события на сегодня
const ics = $input.first().json.data.replace(/\r?\n[ \t]/g, '');
const today = $now.setZone('Europe/Moscow').toFormat('yyyy-MM-dd');
const events = ics.split('BEGIN:VEVENT').slice(1).map(block => {
  const get = (key) => {
    const m = block.match(new RegExp('^' + key + '[^:\\n]*:(.*)$', 'm'));
    return m ? m[1].trim() : '';
  };
  const m = get('DTSTART').match(/^(\d{4})(\d{2})(\d{2})(?:T(\d{2})(\d{2}))?/);
  if (!m) return null;
  return { date: m[1] + '-' + m[2] + '-' + m[3], time: m[4] ? m[4] + ':' + m[5] : 'весь день',
           title: get('SUMMARY'), place: get('LOCATION') };
}).filter(e => e && e.date === today);
events.sort((a, b) => a.time.localeCompare(b.time));
return events.length ? events.map(e => ({ json: e }))
                     : [{ json: { date: today, time: '', title: 'Встреч нет', place: '' } }];

Если вы живёте не в Москве, замените Europe/Moscow на свой пояс, например Asia/Yekaterinburg или Asia/Novosibirsk. Нажмите Execute step: на выходе будут сегодняшние встречи со временем, названием и местом.

Узел «Встречи на сегодня» в n8n: слева код разбора календаря, справа выход — таблица с колонками date, time, title, place и двумя выдуманными встречами на 6 октября: 12:30 «Выезд к заказчику» и 19:00 «Планерка».
Повторяющиеся встречи. Если встреча стоит «каждый понедельник», в файле календаря она записана один раз, с датой первой встречи. Этот код её повторы не разворачивает. Для брифинга заводите важные регулярные встречи отдельными событиями или помните, что их в сводке не будет.

Шаг 4. Сводка от модели

Добавьте узел Code с именем «Собрать данные»: он склеит встречи в один текст для модели.

// Собираем встречи в один текст для модели
const events = $('Встречи на сегодня').all().map(i => i.json).filter(e => e.title !== 'Встреч нет');
const ev = events.length
  ? events.map(e => '- ' + e.time + ' ' + e.title + (e.place ? ' (' + e.place + ')' : '')).join('\n')
  : 'встреч нет';
return [{ json: { data: 'Встречи на сегодня:\n' + ev } }];

Дальше узел Basic LLM Chain, назовите его «Составить брифинг», с моделью google/gemini-3.6-flash и учётными данными из урока 2.3. В поле Prompt (User Message) выберите Define below и впишите {{ $json.data }}. В Chat Messages добавьте системное сообщение. Шаблон рассчитан сразу на весь модуль: письма и задачи появятся в данных позже, а пока модель напишет только про встречи.

Ты ассистент руководителя компании «Название». Ты не программист и не помощник по коду.
По списку встреч, писем и задач составь утренний брифинг по-русски, не длиннее 12 строк:
1) встречи по времени;
2) письма, на которые нужно ответить сегодня, и по одной строке «что сделать»;
3) остальные письма одной строкой, рекламу и спам так и назови;
4) открытые задачи, самые срочные первыми.
Пиши простым текстом, без звёздочек и другой разметки.
Не выдумывай того, чего нет в данных.

Строка «без звёздочек и другой разметки» появилась после прогона. Без неё модель оформила заголовки двойными звёздочками, как в Markdown (языке разметки текста). Telegram звёздочки убрал, но жирным заголовки не сделал, и сводка выглядит не так, как задумала модель. Простой текст надёжнее.

Шаг 5. Отправка в Telegram и расписание

Добавьте узел Telegram → Send a text message с учётными данными бота из урока 2.4. В Chat ID впишите свой номер из Restrict to User IDs, в Text впишите {{ $json.text }}, в Additional Fields выключите Append n8n Attribution. Нажмите Execute workflow: через полминуты в Telegram придёт сводка встреч.

Когда сводка вас устраивает, добавьте второй триггер, Schedule Trigger, и соедините его со скачиванием календаря рядом с ручным. В поле Trigger Interval выберите Custom (Cron) и впишите 0 8 * * 1-5: «в 0 минут 8-го часа, с понедельника по пятницу». Проверьте часовой пояс сценария: меню … справа вверху → Settings → Timezone, там должен стоять ваш город. Затем нажмите Publish. Ручной запуск оставьте для проверок: если нажать Execute workflow в сценарии с двумя триггерами, n8n может пойти по ветке расписания, а не ручной. На прогоне так и было, и это не ошибка: дальше сценарий выполняется одинаково.

Сценарий брифинга в n8n: два триггера (расписание и ручной запуск), скачивание календаря, разбор встреч, сбор данных, цепочка с моделью и отправка в Telegram.

Если не получилось

  • HTTP Request пишет ошибку про JSON. Не выбран Response Format: Text.
  • Встреч нет, хотя в календаре они есть. Встречи на завтра, а код ищет сегодня. Либо в коде не ваш часовой пояс. Добавьте встречу на сегодня и запустите снова.
  • Код пишет «Встреч нет» и в свободный день брифинг всё равно приходит. Так и задумано: в пустой день вы получаете «встреч нет», а не тишину, по которой непонятно, сломался ли ассистент.
  • Брифинг не пришёл в 8:00. Сценарий не опубликован, или в Settings стоит не ваш часовой пояс. Где искать сбои, разберём в уроке 3.5.

Контрольный вопрос. Брифинг приходит каждый день в 11:00 вместо 8:00. Что, скорее всего, не так?

АМодель долго думает
БВ настройках сценария стоит чужой часовой пояс
ВСломалась ссылка на календарь
ГTelegram задерживает сообщения на три часа

Подсказка: Сдвиг ровно на несколько часов и каждый день одинаковый.

На курсе задания проверяются автоматически. Подобрать курс

Контрольный вопрос. Что ассистент пришлёт в свободный от встреч день?

АНичего не пришлёт
БСообщение об ошибке
ВБрифинг со строкой «встреч нет»
ГВстречи на завтра

Подсказка: Посмотрите последнюю строку кода «Встречи на сегодня».

На курсе задания проверяются автоматически. Подобрать курс

Задание. МИССИЯ «Утро начинается с ассистента». Соберите сценарий утреннего брифинга по календарю, проверьте вручную и опубликуйте. Приложите: (1) скриншот сценария целиком; (2) скриншот выхода узла «Встречи на сегодня»; (3) скриншот брифинга в Telegram; (4) скриншот настроек сценария с часовым поясом. Принято, если: в сценарии есть расписание по будням в 8:00 и ручной запуск; узел «Встречи на сегодня» вернул только сегодняшние встречи; брифинг пришёл в Telegram простым текстом, без звёздочек; часовой пояс ваш; сценарий опубликован; на скриншотах нет ссылки на календарь.

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

✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.

На курсе задания проверяются автоматически. Подобрать курс

Что дальше

Брифинг знает про встречи. Следующий шаг — почта: ассистент будет собирать новые письма и добавлять в брифинг то, что требует ответа.

Итог:
• календарь подключён по ссылке, ассистент видит только встречи на сегодня;
• брифинг приходит по будням в 8:00, в пустой день тоже;
• системное сообщение брифинга уже рассчитано на почту и задачи.

← Назад  ·  ↑ В начало урока  ·  ⌂ В начало курса  ·  Вперёд →

Школа Виктора Комлева