Как автоматически отправлять отчёты по почте через Google Apps Script — пошаговое руководство для реальных задач

Представь: каждый понедельник утром тебе нужно собрать данные из Google Таблицы, оформить их в красивый отчёт, прикрепить как PDF и отправить трём менеджерам. Это занимает 20–30 минут. Плюс ты забываешь иногда. Или кто-то из коллег ждёт отчёт, а ты в звонке. А если таких отчётов — пять в неделю? Сколько времени уйдёт за месяц? 20 часов? А если ты не один — целая команда тратит на это время, которое можно потратить на что-то важнее.

Google Apps Script — это бесплатный инструмент внутри Google Workspace, который позволяет автоматизировать рутину. Я не говорю про «надо бы», я говорю про то, как это сделать на практике — так, чтобы через час после старта у тебя уже был работающий скрипт, который отправляет отчёты сам.

Что тебе нужно, чтобы начать

Ты не должен быть программистом. Тебе не нужен сервер, хостинг или API-ключи. Тебе нужно только:

  • Google-аккаунт (рабочий или личный — неважно);
  • Таблица с данными (например, продажи за неделю);
  • Почта получателей (в той же таблице или вручную в скрипте);
  • 15–30 минут времени.

Всё остальное — Google сделает за тебя. Скрипт будет работать в облаке, даже если твой компьютер выключен.

Шаг 1: Подготовь таблицу с данными

Открой Google Таблицы и создай новый файл. Пример структуры — простой, но рабочий:

Дата Продажи Клиенты Ответственный Почта получателя
01.04.2024 142 500 ₽ 37 Иван Петров ivan.petrov@company.com
08.04.2024 168 900 ₽ 41 Мария Сидорова m.sidorova@company.com
15.04.2024 131 200 ₽ 33 Алексей Козлов a.kozlov@company.com

Это твой источник данных. Важно: не используй пустые строки между заголовками и данными — скрипт может их не увидеть. Также убедись, что в столбце с почтами нет опечаток. Одна ошибка — и письмо не дойдёт.

Шаг 2: Открой редактор скриптов

В таблице нажми: Расширения → Apps Script. Откроется пустой редактор. Удали всё, что там есть (если оно есть), и вставь этот код:

function sendWeeklyReport() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  // Берём данные из первой строки (заголовки) и до последней
  const data = sheet.getRange(2, 1, lastRow - 1, 5).getValues(); // строки 2–последняя, столбцы 1–5
  
  // Формируем тело письма
  let emailBody = `
    

Еженедельный отчёт

Вот данные за неделю:

`; data.forEach(row => { emailBody += ` `; }); emailBody += `
Дата Продажи Клиенты Ответственный
${row[0]} ${row[1]} ${row[2]} ${row[3]}

С уважением, автоматизированный отчёт.

`; // Отправляем письмо каждому получателю data.forEach(row => { const recipientEmail = row[4]; if (recipientEmail && recipientEmail.includes('@')) { MailApp.sendEmail({ to: recipientEmail, subject: 'Еженедельный отчёт — ' + row[0], htmlBody: emailBody }); } }); Logger.log('Отчёты отправлены: ' + data.length + ' писем'); }

Этот код:

  1. Читает все строки с данными (кроме заголовков);
  2. Собирает HTML-таблицу из этих данных;
  3. Отправляет письмо каждому, чья почта указана в столбце E;
  4. Логирует результат — можно посмотреть в меню Просмотр → Журналы.

Не пугайся, что это HTML — ты не пишешь его с нуля. Просто копируешь, вставляешь, и всё работает.

Шаг 3: Настрой расписание

Теперь скрипт работает, но только если ты его запустишь вручную. А ты хочешь, чтобы он работал сам. Нажми на Триггеры (иконка с часами в левом боковом меню).

Нажми + Добавить триггер. Выбери:

  • Функция: sendWeeklyReport
  • Тип триггера: Время — Еженедельно
  • Время: Понедельник, 8:00

Сохрани. Теперь каждый понедельник в 8:00 по твоему часовому поясу скрипт запустится сам. Даже если ты спишь.

Что можно менять — и как

Ты не обязан копировать этот код точно. Вот что можно адаптировать под себя:

1. Другой день недели

В триггере выбери не «понедельник», а «вторник» или «пятница». Или даже «каждый день в 9:00» — если отчёты ежедневные.

2. Другой формат отчёта

Вместо HTML-таблицы можно отправить PDF. Для этого добавь в код:

// Добавь перед MailApp.sendEmail:
const pdfBlob = SpreadsheetApp.getActiveSpreadsheet().getAs('application/pdf').setName('Отчёт_за_неделю.pdf');

// И в MailApp.sendEmail добавь:
attachments: [pdfBlob]

Теперь письмо приходит с прикреплённым PDF-файлом. Но: PDF создаётся для всей таблицы, а не только для данных. Если у тебя много листов — это может быть неудобно. Тогда лучше использовать только HTML.

3. Отправка только определённым людям

Если ты хочешь, чтобы отчёт шёл только менеджерам, а не всем, можно добавить фильтр:

const managers = ['ivan.petrov@company.com', 'm.sidorova@company.com'];

data.forEach(row => {
  const recipientEmail = row[4];
  if (recipientEmail && managers.includes(recipientEmail)) {
    MailApp.sendEmail({ ... });
  }
});

Так ты точно не отправишь отчёт случайно бухгалтеру или внешнему подрядчику.

4. Добавить статистику

Хочешь, чтобы в письме было: «Всего продаж: 442 600 ₽»? Добавь это перед таблицей:

const totalSales = data.reduce((sum, row) => sum + (row[1] || 0), 0);
emailBody = `
  

Еженедельный отчёт

Всего продаж за неделю: ${totalSales} ₽

Вот детали:

...

И всё будет считаться автоматически. Никаких ручных подсчётов.

Что часто ломает скрипт — и как этого избежать

Я видел десятки таких случаев. Вот основные ошибки, которые мешают работе:

  • Почта не в формате email — например, «Иван Петров» вместо «ivan.petrov@company.com». Скрипт не проверяет, есть ли @ — просто отправляет. И письмо не доходит. Решение: добавь в код проверку if (recipientEmail && recipientEmail.includes('@')).
  • Слишком много данных — если таблица больше 10 000 строк, скрипт может не успеть обработать всё. Google ограничивает время выполнения на 6 минут. Решение: разбей отчёт на недельные листы или фильтруй только последние 100 строк.
  • Нет доступа к почте — если ты используешь корпоративный аккаунт, администратор может отключить отправку писем через скрипты. Проверь в Админ-консоли Google Workspace → Безопасность → Доступ к API.
  • Изменённая структура таблицы — ты добавил столбец «Прибыль», и теперь почта оказалась не в столбце E, а в F. Скрипт всё ещё смотрит на 5-й столбец — и получает пустоту. Решение: всегда проверяй номер столбца в getRange(2, 1, ...) — цифры должны соответствовать реальным колонкам.
  • Скрипт не запускается — ты забыл сохранить триггер. Или удалил его. Проверяй триггеры раз в месяц — они не исчезают сами, но иногда их «сбивает» обновление Google.

Когда использовать этот способ — и когда нет

Этот метод отлично работает, если:

  • Данные лежат в Google Таблицах;
  • Получатели — сотрудники с корпоративной почтой;
  • Отчёт не требует сложной визуализации (графики, диаграммы);
  • Ты не хочешь платить за сторонние сервисы (Zapier, Make, Power Automate).

А вот если:

  • Тебе нужно отправлять отчёты клиентам с личной почтой (Gmail, Яндекс, Mail.ru) — всё равно работает;
  • Ты хочешь вставлять в письмо графики — лучше использовать Google Data Studio (Looker Studio) и отправлять PDF оттуда;
  • Ты отправляешь отчёты 100+ людям в день — Google может заблокировать аккаунт за спам. Лимит: 100 писем в день для личного аккаунта, 1 500 для Google Workspace. Не перегружай.
  • Отчёт требует подписи, печати, юридической формы — лучше использовать шаблоны в Word или специализированные CRM.

Как сделать идеально — 5 рекомендаций от практика

  1. Тестируй на одном человеке — перед тем как включить триггер на всех, запусти скрипт вручную и отправь себе письмо. Проверь, как выглядит HTML, есть ли опечатки, правильно ли подставлены цифры.
  2. Сделай резервную копию таблицы — если ты случайно удалишь столбец с почтами, скрипт может начать слать письма на пустые адреса. Создай копию с названием «Отчёт_на_само_тестирование».
  3. Используй логи — после запуска открой Просмотр → Журналы. Там ты увидишь, сколько писем отправлено. Если 0 — значит, что-то пошло не так.
  4. Не пиши письма с «Уважаемый» — если ты знаешь имя получателя, вставляй его: Привет, ${row[3]}!. Это повышает открытие писем. Люди не любят шаблоны.
  5. Запомни: это не CRM — если тебе нужно отслеживать, кто открыл письмо, кто ответил, кто не прочитал — это уже задача для почтовых сервисов вроде Mailchimp или SendGrid. Apps Script — для простых, автоматических задач.

Что выбрать: HTML, PDF или оба?

Если ты только начинаешь — начни с HTML. Он:

  • Загружается мгновенно;
  • Отображается в любом почтовом клиенте;
  • Легко редактируется;
  • Не требует дополнительных действий.

PDF нужен, если:

  • Ты отправляешь отчёт руководству, и они требуют «официальный формат»;
  • Ты хочешь, чтобы отчёт нельзя было легко скопировать;
  • Ты включаешь в отчёт несколько листов таблицы.

Вот сравнение:

Параметр HTML PDF
Скорость отправки Секунды 5–15 секунд (генерация)
Размер письма Маленький Большой (100–500 КБ)
Редактирование Легко — просто меняй код Трудно — нужно перегенерировать
Поддержка в почте Все клиенты Некоторые мобильные клиенты не отображают встроенный PDF
Подходит для Ежедневные отчёты, команды Отчёты для руководства, аудит

Если ты не уверен — начни с HTML. Потом, когда поймёшь, как это работает, добавь PDF как дополнительный вариант.

Что делать дальше

Ты только что автоматизировал рутину, которая отнимала у тебя 2–3 часа в неделю. Это не «маленькая победа» — это смена подхода. Теперь ты не тратишь время на то, что может сделать машина.

Следующий шаг — расширить эту систему. Например:

  • Собирать отчёты из нескольких таблиц — объединить продажи, расходы, поддержку;
  • Отправлять уведомления, если продажи упали ниже порога — добавь условие if (totalSales < 100000) { ... };
  • Сохранять копии отчётов в Google Диск — добавь DriveApp.createFile();
  • Связать с Google Forms — если клиенты заполняют форму, автоматически генерировать отчёт по итогам дня.

Но не спешить. Сначала убедись, что твой текущий скрипт работает стабильно. Проверь его трижды: вручную, через триггер, на следующей неделе. Если всё работает — ты сделал всё правильно.

Попробуй. Запусти. Через неделю ты будешь смотреть на свои старые отчёты и думать: «Как я раньше жил без этого?»

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