Вы устали каждый понедельник вручную собирать данные из таблицы, оформлять отчёт и отправлять его руководителю? Хорошая новость: это можно автоматизировать примерно за час работы, и не нужно быть программистом. Google Apps Script — это встроенный инструмент в Google Workspace, который позволяет писать скрипты для автоматизации рутины в Google Таблицах, Документах, Почте и других сервисах.
В этой статье я покажу на конкретном примере, как сделать так, чтобы отчёт формировался и уходил на почту по расписанию — без вашего участия. Разберём от простого скрипта до продвинутых сценариев, которые пригодятся в реальной работе.
- Что вообще такое Google Apps Script и почему именно он
- Простой пример: отправка одного письма из таблицы
- Шаг 1. Откройте редактор скриптов
- Шаг 2. Настройте триггер по расписанию
- Как сделать отчёт красивым: HTML-письма
- Какой подход выбрать
- Сценарии под разные ситуации
- Если нужно отправлять один отчёт одному человеку
- Если отчёт нужен нескольким людям с разными данными
- Если нужно прикреплять таблицу как файл
- Частые ошибки и как их избежать
- Практические рекомендации
- Что делать, если стандартных возможностей не хватает
- Итог
Что вообще такое 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. Настройте триггер по расписанию
В редакторе скриптов нажмите на значок часов слева («Триггеры»). Нажмите «Добавить триггер» и настройте:
- Функция для запуска: sendReport
- Источник события: по времени
- Триггер по времени: по дням недели
- День недели: пятница
- Время: например, с 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 += `
${data[i][0]}
${data[i][1]}
${data[i][2].toLocaleString('ru-RU')} ₽
`;
}
htmlBody += `
Итого: 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. Это улучшает доставляемость.
Практические рекомендации
Вот что я бы посоветовал сделать сразу, чтобы автоматизация не стала источником проблем:
- Добавьте логирование. После каждого запуска записывайте дату и результат в отдельный лист таблицы. Так вы будете видеть, что скрипт отработал, и сможете найти ошибку, если что-то пошло не так.
function logExecution(status) {
var logSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лог");
if (!logSheet) {
logSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet("Лог");
logSheet.appendRow(["Дата", "Статус"]);
}
logSheet.appendRow([new Date(), status]);
}
- Оберните основной код в try-catch. Если скрипт упадёт, вы узнаете об этом из лога, а не из того, что отчёт просто не пришёл.
function sendReport() {
try {
// ... основной код ...
logExecution("Успешно");
} catch (e) {
logExecution("Ошибка: " + e.message);
MailApp.sendEmail("admin@example.com", "Ошибка в скрипте отчёта", e.message);
}
}
- Храните настройки в отдельном листе. Адреса получателей, темы писем, списки фильтрации — всё это лучше вынести в конфигурационный лист, а не захардкоживать в коде. Когда получатель сменится, вы поменяете одну ячейку в таблице, а не полезете в скрипт.
- Тестируйте на себе. Перед тем как указать адрес руководителя, отправьте тестовое письмо на свою почту. Убедитесь, что форматирование не слетело, числа отображаются правильно, а вложения открываются.
- Учитывайте часовые пояса. 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 на свой, запустите вручную — и через минуту первый автоматический отчёт будет в вашем почтовом ящике.
