Первое, что делает хороший помощник утром, — говорит, что у вас сегодня. Без этого день начинается с открытия трёх приложений. В этом уроке соберём сценарий, который в 8:00 по будням сам смотрит в календарь и присылает встречи в Telegram. Это основа брифинга: в следующих уроках мы добавим в него почту и задачи.
Чему научитесь в этом уроке:
• подключить Яндекс Календарь к n8n по ссылке;
• оставить только встречи на сегодня с учётом часового пояса;
• запустить сценарий по расписанию и проверить его вручную.
Как будет устроен сценарий
Вспомните схему процесса из урока 1.4: триггер, шаги, результат. Здесь она такая:
- Расписание будит сценарий в 8:00 по будням.
- HTTP Request скачивает календарь по ссылке. Это тот же файл, который вы скачали бы, открыв ссылку в браузере.
- Code находит в файле встречи на сегодня.
- Basic LLM Chain с моделью из урока 2.3 пишет короткую сводку.
- 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: на выходе будут сегодняшние встречи со временем, названием и местом.

Повторяющиеся встречи. Если встреча стоит «каждый понедельник», в файле календаря она записана один раз, с датой первой встречи. Этот код её повторы не разворачивает. Для брифинга заводите важные регулярные встречи отдельными событиями или помните, что их в сводке не будет.
Шаг 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 может пойти по ветке расписания, а не ручной. На прогоне так и было, и это не ошибка: дальше сценарий выполняется одинаково.

Если не получилось
- HTTP Request пишет ошибку про JSON. Не выбран Response Format: Text.
- Встреч нет, хотя в календаре они есть. Встречи на завтра, а код ищет сегодня. Либо в коде не ваш часовой пояс. Добавьте встречу на сегодня и запустите снова.
- Код пишет «Встреч нет» и в свободный день брифинг всё равно приходит. Так и задумано: в пустой день вы получаете «встреч нет», а не тишину, по которой непонятно, сломался ли ассистент.
- Брифинг не пришёл в 8:00. Сценарий не опубликован, или в Settings стоит не ваш часовой пояс. Где искать сбои, разберём в уроке 3.5.
Контрольный вопрос. Брифинг приходит каждый день в 11:00 вместо 8:00. Что, скорее всего, не так?
Подсказка: Сдвиг ровно на несколько часов и каждый день одинаковый.
На курсе задания проверяются автоматически. Подобрать курс
Контрольный вопрос. Что ассистент пришлёт в свободный от встреч день?
Подсказка: Посмотрите последнюю строку кода «Встречи на сегодня».
На курсе задания проверяются автоматически. Подобрать курс
Задание. МИССИЯ «Утро начинается с ассистента». Соберите сценарий утреннего брифинга по календарю, проверьте вручную и опубликуйте. Приложите: (1) скриншот сценария целиком; (2) скриншот выхода узла «Встречи на сегодня»; (3) скриншот брифинга в Telegram; (4) скриншот настроек сценария с часовым поясом. Принято, если: в сценарии есть расписание по будням в 8:00 и ручной запуск; узел «Встречи на сегодня» вернул только сегодняшние встречи; брифинг пришёл в Telegram простым текстом, без звёздочек; часовой пояс ваш; сценарий опубликован; на скриншотах нет ссылки на календарь.
Подсказка: Встреч на сегодня нет? Добавьте выдуманную встречу на сегодня в тестовый календарь, иначе нечего будет проверить.
✅ Готово, если: программа запускается без ошибок и выводит то, что просят в задании.
На курсе задания проверяются автоматически. Подобрать курс
Что дальше
Брифинг знает про встречи. Следующий шаг — почта: ассистент будет собирать новые письма и добавлять в брифинг то, что требует ответа.
Итог:
• календарь подключён по ссылке, ассистент видит только встречи на сегодня;
• брифинг приходит по будням в 8:00, в пустой день тоже;
• системное сообщение брифинга уже рассчитано на почту и задачи.
