Как настроить автоматическую отправку отчётов через Google Apps Script

Вы устали каждый понедельник вручную собирать данные из таблицы, оформлять отчёт и отправлять его руководителю? Хорошая новость: это можно автоматизировать примерно за час работы, и не нужно быть программистом. Google Apps Script — это встроенный инструмент в Google Workspace, который позволяет писать скрипты для автоматизации рутины в Google Таблицах, Документах, Почте и других сервисах.

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

Что вообще такое Google Apps Script и почему именно он

Google Apps Script — это облачный язык программирования на базе JavaScript. Он работает прямо внутри вашего Google Диска, не требует установки ничего на компьютер и интегрирован со всеми сервисами Google Workspace.

Почему он подходит для автоматической отправки отчётов:

  • Прямой доступ к данным из Google Таблиц — не нужно настраивать API, токены и подключения.
  • Встроенная функция отправки писем через Gmail — достаточно одной строчки кода.
  • Триггеры по расписанию — скрипт запускается сам, без вашего участия.
  • Бесплатно — для личных и рабочих аккаунтов Google Workspace лимиты более чем достаточны.

Лимиты, которые стоит знать заранее: Google разрешает отправлять до 100 писем в день на бесплатном аккаунте и до 1500 для Google Workspace. Если отчётов больше — это уже повод задуматься о другом решении или о распределении нагрузки.

Простой пример: отправка одного письма из таблицы

Допустим, у вас есть Google Таблица с данными о продажах за неделю, и каждую пятницу нужно отправлять сводку менеджеру. Вот пошаговый план.

Шаг 1. Откройте редактор скриптов

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

function sendReport() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var data = sheet.getDataRange().getValues();
  
  var report = "Еженедельный отчёт\n\n";
  report += "Данные из таблицы:\n";
  
  for (var i = 0; i < data.length; i++) {
    report += data[i].join(", ") + "\n";
  }
  
  MailApp.sendEmail({
    to: "manager@example.com",
    subject: "Еженедельный отчёт — " + new Date().toLocaleDateString(),
    body: report
  });
}

Этот скрипт берёт все данные из активного листа, собирает их в текстовую строку и отправляет на указанный адрес. Примитивно, но рабочо — и это база, на которой мы будем строить.

Шаг 2. Настройте триггер по расписанию

В редакторе скриптов нажмите на значок часов слева («Триггеры»). Нажмите «Добавить триггер» и настройте:

  1. Функция для запуска: sendReport
  2. Источник события: по времени
  3. Триггер по времени: по дням недели
  4. День недели: пятница
  5. Время: например, с 17:00 до 18:00

Сохраните триггер. Теперь каждую пятницу скрипт будет запускаться сам и отправлять письмо. При первом запуске Google попросит разрешить скрипту доступ к вашей почте и таблицам — это стандартная процедура авторизации.

Как сделать отчёт красивым: HTML-письма

Обычный текст — это нормально для начала, но руководитель скорее хочет видеть структурированный отчёт с таблицей, выделенными числами и понятной структурой. Для этого используем HTML-формат письма.

function sendHtmlReport() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Продажи");
  var data = sheet.getDataRange().getValues();
  
  var totalRevenue = 0;
  var totalOrders = data.length - 1; // минус заголовок
  
  for (var i = 1; i < data.length; i++) {
    totalRevenue += data[i][2]; // предположим, выручка в третьем столбце
  }
  
  var htmlBody = `
    

Отчёт за неделю

Период: ${new Date().toLocaleDateString()}

`; for (var i = 1; i < data.length; i++) { htmlBody += ` `; } htmlBody += `
Менеджер Заказы Выручка
${data[i][0]} ${data[i][1]} ${data[i][2].toLocaleString('ru-RU')} ₽
Итого: totalOrders заказов на сумму{totalRevenue.toLocaleString('ru-RU')} ₽
`; MailApp.sendEmail({ to: "manager@example.com", subject: "Отчёт по продажам — неделя от " + new Date().toLocaleDateString(), htmlBody: htmlBody }); }

Здесь уже больше кода, но принцип тот же: берём данные из таблицы, формируем HTML-шаблон и отправляем. Разница в том, что письмо будет выглядеть как страница с форматированием, а не как простыня текста.

Какой подход выбрать

В зависимости от вашей задачи подойдёт разный вариант. Вот сравнение, которое поможет определиться:

Критерий Простой текст HTML-письмо Вложение PDF
Скорость настройки 10 минут 30–60 минут 1–2 часа
Внешний вид Минимальный Хороший Профессиональный
Подходит для Быстрая проверка данных, внутренняя рассылка Регулярные отчёты руководству, клиентам Формальные отчёты, документы для внешних контрагентов
Сложность поддержки Очень просто Средне Сложнее — нужна работа с PDF-сервисами
Лимиты Gmail 100 писем/день 100 писем/день 100 писем/день, но размер вложения до 25 МБ

Сценарии под разные ситуации

Если нужно отправлять один отчёт одному человеку

Самый простой случай. Используйте пример с HTML-письмом выше, настройте триггер — и забудьте о рутине. Главное — убедитесь, что структура таблицы не меняется, иначе скрипт начнёт сбоить.

Если отчёт нужен нескольким людям с разными данными

Например, каждому менеджеру — его личная статистика. В этом случае добавляем фильтрацию по столбцу с именем менеджера и цикл по списку получателей:

function sendPersonalReports() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Продажи");
  var data = sheet.getDataRange().getValues();
  
  // Список менеджеров и их email
  var managers = {
    "Иванов": "ivanov@example.com",
    "Петрова": "petrova@example.com",
    "Сидоров": "sidorov@example.com"
  };
  
  for (var name in managers) {
    var managerData = data.filter(function(row) {
      return row[0] === name;
    });
    
    if (managerData.length === 0) continue;
    
    var total = 0;
    managerData.forEach(function(row) {
      total += row[2];
    });
    
    MailApp.sendEmail({
      to: managers[name],
      subject: "Ваш отчёт за неделю",
      htmlBody: `

Здравствуйте, ${name}!

Ваша выручка за неделю: ${total.toLocaleString('ru-RU')} ₽

Количество заказов: ${managerData.length}

` }); } }

Если нужно прикреплять таблицу как файл

Иногда отчёт нужен не в теле письма, а как отдельный файл — например, Excel или PDF. Вот пример с экспортом в Excel:

function sendReportWithAttachment() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var url = ss.getUrl().replace(/edit$/, '') + 
            'export?format=xlsx&id=' + ss.getId();
  
  var token = ScriptApp.getOAuthToken();
  var response = UrlFetchApp.fetch(url, {
    headers: { 'Authorization': 'Bearer ' + token }
  });
  
  MailApp.sendEmail({
    to: "manager@example.com",
    subject: "Отчёт в Excel — " + new Date().toLocaleDateString(),
    body: "Актуальный отчёт во вложении.",
    attachments: [{
      fileName: "Отчёт.xlsx",
      content: response.getBlob().getBytes(),
      mimeType: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
    }]
  });
}

Частые ошибки и как их избежать

Когда люди начинают работать с Apps Script для отправки отчётов, есть несколько типичных проблем, которые превращают автоматизацию в головную боль.

  • Структура таблицы изменилась — скрипт сломался. Решение: обращайтесь к столбцам по заголовкам, а не по индексам. Или хотя бы добавьте проверку: если в ячейке пусто, скрипт не падает, а пропускает строку.
  • Забыли про авторизацию. При первом запуске скрипт запрашивает разрешение. Если нажать «Отмена» или проигнорировать — ничего не заработает. Запустите скрипт вручную один раз из редактора и дайте все разрешения.
  • Превышен лимит отправки. 100 писем в день — это немного, если вы рассылаете отчёты по всей компании. Решение: группируйте данные в одно письмо с несколькими получателями или используйте рассылку через группы Google.
  • Скрипт работает вручную, но не запускается по триггеру. Проверьте: триггер сохранён, функция называется именно так, как указано в триггере, и у скрипта есть необходимые разрешения.
  • Письма попадают в спам. Если вы отправляете письма на внешние адреса, добавьте текстовую версию письма (параметр body) наряду с htmlBody. Это улучшает доставляемость.

Практические рекомендации

Вот что я бы посоветовал сделать сразу, чтобы автоматизация не стала источником проблем:

  1. Добавьте логирование. После каждого запуска записывайте дату и результат в отдельный лист таблицы. Так вы будете видеть, что скрипт отработал, и сможете найти ошибку, если что-то пошло не так.
function logExecution(status) {
  var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лог");
  if (!logSheet) {
    logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Лог");
    logSheet.appendRow(["Дата", "Статус"]);
  }
  logSheet.appendRow([new Date(), status]);
}
  1. Оберните основной код в try-catch. Если скрипт упадёт, вы узнаете об этом из лога, а не из того, что отчёт просто не пришёл.
function sendReport() {
  try {
    // ... основной код ...
    logExecution("Успешно");
  } catch (e) {
    logExecution("Ошибка: " + e.message);
    MailApp.sendEmail("admin@example.com", "Ошибка в скрипте отчёта", e.message);
  }
}
  1. Храните настройки в отдельном листе. Адреса получателей, темы писем, списки фильтрации — всё это лучше вынести в конфигурационный лист, а не захардкоживать в коде. Когда получатель сменится, вы поменяете одну ячейку в таблице, а не полезете в скрипт.
  2. Тестируйте на себе. Перед тем как указать адрес руководителя, отправьте тестовое письмо на свою почту. Убедитесь, что форматирование не слетело, числа отображаются правильно, а вложения открываются.
  3. Учитывайте часовые пояса. Google Apps Script работает в часовом поясе скрипта, который может не совпадать с вашим. В настройках проекта (файл project.json) укажите свой часовой пояс: "timeZone": "Europe/Moscow".

Что делать, если стандартных возможностей не хватает

Google Apps Script — мощный инструмент, но у него есть ограничения. Если вам нужно отправлять больше 100 писем в день, работать с внешними API или обрабатывать объёмы данных, которые тормозят скрипт (выполнение ограничено 6 минутами для бесплатных аккаунтов), есть пути развития:

  • Использовать Google Groups для массовых рассылок — одно письмо в группу считается за одну отправку.
  • Подключить внешние сервисы через UrlFetchApp — например, отправлять отчёты через SendGrid или Mailgun, если нужны большие объёмы.
  • Для сложных отчётов с графиками генерировать Google Документ через DocumentApp и присылать ссылку на него вместо вложения.

Итог

Автоматическая отправка отчётов через Google Apps Script — это один из тех случаев, когда час вложенного времени экономит часы рутины каждый месяц. Начните с простого скрипта, который собирает данные из таблицы и отправляет письмо. Постепенно добавляйте HTML-форматирование, персонализацию для разных получателей и логирование.

Главное — не усложняйте с первого раза. Напишите рабочий вариант, настройте триггер, проверьте на себе и только потом добавляйте красоту и дополнительные функции. Так вы получите работающую систему, а не бесконечный процесс разработки.

Если хотите попробовать прямо сейчас — откройте свою Google Таблицу, зайдите в редактор скриптов и вставьте базовый пример из начала статьи. Замените email на свой, запустите вручную — и через минуту первый автоматический отчёт будет в вашем почтовом ящике.

ITZnanie.ru