Google Таблицы умеют не только хранить и считать данные, но и самостоятельно отправлять письма на основе того, что в них записано. Это реализуется через Apps Script – встроенную среду для написания скриптов, которая доступна прямо из любой таблицы и не требует установки сторонних инструментов. Один раз написанный скрипт может разослать десятки персонализированных писем, автоматически подставив в каждое имя, сумму или любые другие данные из строк таблицы. В этой статье разберем весь процесс по шагам: от открытия редактора скриптов до настройки автоматического запуска по расписанию.
Как открыть редактор скриптов
Прежде чем писать код, нужно попасть в редактор Apps Script. Он встроен в Google Таблицы и открывается в несколько кликов.
-
Откройте таблицу, с которой планируете работать.
-
В верхнем меню нажмите «Расширения» – «Apps Script».
-
В новой вкладке откроется редактор с пустым файлом Код.gs. Именно сюда и будет вписываться весь код.
![]()
Если вы уже работали с Apps Script раньше, в этом же меню будут доступны сохраненные проекты. Для новой задачи удобнее создать отдельный проект, чтобы не путать скрипты между собой.
Читайте также в Комьюнити: Введение в работу с Apps Script в Google Таблицах
Отправка первого письма через MailApp
Для отправки писем в Apps Script есть специальный сервис – MailApp. Его главное преимущество в простоте: достаточно указать адрес получателя, тему и текст, и письмо уйдет. При этом скрипт требует минимальных разрешений и реже, чем альтернативные решения, запрашивает повторную авторизацию у пользователя.
Давайте начнем с самого простого примера – отправки одного письма вручную. Это позволит убедиться, что редактор работает корректно и разрешения на отправку предоставлены.
Удалите содержимое файла Код.gs и вставьте следующий код:
function sendTestEmail() {
var recipient = "адрес@example.com";
var subject = "Тестовое письмо из Google Таблиц";
var body = "Это письмо отправлено через Apps Script. Все работает!";
MailApp.sendEmail(recipient, subject, body);
}
![]()
-
Замените адрес@example.com на свой реальный адрес электронной почты.

-
Нажмите кнопку «Сохранить проект» на верхней панели – она выглядит как иконка дискеты.

-
Нажмите кнопку «Выполнить» (треугольник), которая тоже находится на верхней панели.

-
При первом запуске появится запрос на предоставление разрешений. Нажмите «Просмотреть разрешения», выберите свой аккаунт Google и на следующем экране нажмите «Разрешить».

-
После завершения выполнения проверьте входящие письма – письмо должно прийти в течение нескольких секунд.

Если письмо пришло, значит скрипт настроен правильно и можно двигаться дальше.
Рассылка по списку получателей из таблицы
Основная ценность связки Таблицы + Apps Script раскрывается именно тогда, когда письма нужно разослать по списку. Пусть на первом листе таблицы в столбце A находятся имена получателей, а в столбце B – их адреса электронной почты, начиная со второй строки (первая – заголовок).
![]()
Скрипт ниже перебирает все строки в этом списке и отправляет каждому получателю письмо. Обратите внимание на строку с getSheetByName – туда нужно вписать точное название вашего листа, как оно отображается на вкладке внизу таблицы. Если лист называется «Лист1», оставьте как есть; если «Получатели» или что-то другое – замените соответственно.
Замените код в Код.gs на следующий:
function sendEmailsFromSheet() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");
var lastRow = sheet.getLastRow();
for (var i = 2; i <= lastRow; i++) {
var name = sheet.getRange(i, 1).getValue();
var email = sheet.getRange(i, 2).getValue();
if (email) {
var subject = "Привет, " + name + "!";
var body = "Это письмо отправлено автоматически из Google Таблиц.";
MailApp.sendEmail(email, subject, body);
}
}
}
![]()
Сохраните файл и запустите функцию sendEmailsFromSheet через кнопку «Выполнить».
Несколько пояснений к коду. getSheetByName("Лист1") обращается к листу по его имени – это надежнее, чем getActiveSheet(), который при автоматическом запуске по триггеру всегда возвращает первый лист таблицы, вне зависимости от того, какой лист был открыт в браузере. getLastRow() возвращает номер последней заполненной строки, чтобы скрипт не перебирал пустые строки до конца листа. Условие if (email) добавлено специально на случай, если в списке попадутся строки с пустой ячейкой адреса – такие строки просто пропускаются без ошибки.
Персонализированная подстановка данных из ячеек
Письма с обращением по имени воспринимаются значительно лучше, чем безличные рассылки. Однако имя – лишь один из вариантов персонализации. Из таблицы можно подтянуть в письмо любые данные: сумму задолженности, дату встречи, название заказа или любую другую информацию из соответствующей строки.
Предположим, что в столбце C находится сумма к оплате. Тогда в тело письма ее можно добавить вот так:
function sendPersonalizedEmails() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");
var lastRow = sheet.getLastRow();
for (var i = 2; i <= lastRow; i++) {
var name = sheet.getRange(i, 1).getValue();
var email = sheet.getRange(i, 2).getValue();
var amount = sheet.getRange(i, 3).getValue();
if (email) {
var subject = "Информация по вашему счету";
var body = "Здравствуйте, " + name + "!\n\n"
+ "Сумма к оплате: " + amount + " руб.\n\n"
+ "Спасибо за сотрудничество.";
MailApp.sendEmail(email, subject, body);
}
}
}
![]()
Символ \n в строке отвечает за перенос строки внутри текста письма. Два таких символа подряд – \n\n – добавляют пустую строку между абзацами, что делает письмо более читаемым.
![]()
Переменные name, email и amount берутся из конкретных ячеек текущей строки и вставляются прямо в текст через знак +.
Отметка об отправке прямо в таблице
При большом списке важно знать, кому письмо уже ушло, а кому – нет. Скрипт можно дополнить записью статуса в отдельный столбец. Это также поможет избежать повторной отправки, если запустить скрипт несколько раз: при следующем запуске строки с уже заполненной отметкой будут пропускаться.
Предположим, что столбец D отведен под статус. В этом варианте скрипт загружает все данные из таблицы за один запрос через getValues() – до начала цикла, а не обращается к каждой ячейке отдельно.
![]()
При небольшом списке разница незаметна, но при нескольких сотнях строк такой подход работает значительно быстрее и снижает риск упереться в ограничение времени выполнения (6 минут на один запуск).
function sendEmailsWithStatus() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");
var lastRow = sheet.getLastRow();
if (lastRow < 2) return;
var data = sheet.getRange(2, 1, lastRow - 1, 4).getValues();
for (var i = 0; i < data.length; i++) {
var name = data[i][0];
var email = data[i][1];
var status = data[i][3];
if (email && status !== "Отправлено") {
var subject = "Привет, " + name + "!";
var body = "Это автоматическое письмо из Google Таблиц.";
MailApp.sendEmail(email, subject, body);
sheet.getRange(i + 2, 4).setValue("Отправлено");
}
}
}
getRange(2, 1, lastRow - 1, 4) забирает весь диапазон от второй строки до последней, охватывая 4 столбца. getValues() возвращает его как двумерный массив, где data[i][0] – это первый столбец строки, data[i][1] – второй и так далее.
![]()
Запись статуса по-прежнему идет в таблицу по одной строке через setValue, но это не критично – операций записи значительно меньше, чем операций чтения.
![]()
После отправки каждого письма в ячейку четвертого столбца текущей строки записывается текст «Отправлено». При следующем запуске скрипт проверяет это значение и пропускает уже обработанные строки. Такой подход удобен при постепенном пополнении списка – достаточно добавить новые строки и запустить скрипт снова.
HTML-письма: форматирование и ссылки
По умолчанию MailApp отправляет письма в виде обычного текста. Если нужно добавить форматирование, ссылки или выделить важные фрагменты жирным – стоит использовать HTML-версию письма. Для этого в вызов sendEmail передается дополнительный параметр htmlBody.
function sendHtmlEmail() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Лист1");
var lastRow = sheet.getLastRow();
if (lastRow < 2) return;
var data = sheet.getRange(2, 1, lastRow - 1, 2).getValues();
for (var i = 0; i < data.length; i++) {
var name = data[i][0];
var email = data[i][1];
if (email) {
var subject = "Информация для " + name;
var plainBody = "Здравствуйте, " + name + "! Подробности по ссылке.";
var htmlBody = "<p>Здравствуйте, <strong>" + name + "</strong>!</p>"
+ "<p>Подробности доступны по <a href='https://example.com'>этой ссылке</a>.</p>";
MailApp.sendEmail(email, subject, plainBody, {htmlBody: htmlBody});
}
}
}
![]()
Параметр plainBody – это запасной вариант текста для тех почтовых клиентов, которые не поддерживают HTML. Хорошим тоном считается всегда заполнять оба варианта, пусть даже обычная текстовая версия будет попроще. В параметре htmlBody используется стандартная HTML-разметка: теги <p> для абзацев, <strong> для жирного текста, <a href="..."> для ссылок.
Автоматический запуск по триггеру
До этого момента все скрипты запускались вручную. Однако Apps Script позволяет настроить автоматический запуск по расписанию – например, каждое утро в 9 часов или раз в неделю по понедельникам. Это удобно для регулярных отчетов или напоминаний.
-
В редакторе Apps Script нажмите на значок часов в левой панели – это раздел «Триггеры».

-
В правом нижнем углу нажмите «Добавить триггер».

-
В открывшемся окне выберите функцию, которую нужно запускать, например sendEmailsWithStatus.
-
В поле «Выбрать источник события» оставьте «Триггер по времени».

-
Укажите нужное расписание, например «По дням» и время «8:00 – 9:00».

-
Нажмите «Сохранить».
С этого момента скрипт будет запускаться автоматически в указанное время, даже если таблица закрыта. Триггер работает от аккаунта, который его создал, поэтому письма будут уходить с вашего адреса Gmail. Там же в разделе «Триггеры» можно в любой момент изменить расписание или полностью отключить автозапуск.
Лимиты отправки
Перед запуском рассылки стоит учитывать ограничения, которые Google устанавливает для Apps Script. Для обычных аккаунтов на gmail.com лимит составляет 100 получателей в сутки, для аккаунтов Google Workspace – 1500 получателей. В одном письме можно указать не более 50 адресов одновременно. Лимит сбрасывается каждые 24 часа с момента первой отправки за текущий период, а не в полночь по московскому времени.
Чтобы узнать, сколько писем еще можно отправить в текущие сутки, добавьте в скрипт следующую строчку перед циклом for или if:
Logger.log("Доступно писем сегодня: " + MailApp.getRemainingDailyQuota());
![]()
После запуска скрипта результат появится в панели «Журнал выполнения», которая автоматически открывается внизу редактора. Если лимит близок к нулю или уже исчерпан, скрипт завершится с ошибкой Service invoked too many times: Email. В этом случае нужно просто подождать следующего периода или разбить рассылку на несколько дней.
Если 100 писем в сутки не хватает для задачи, а аккаунт Google Workspace недоступен, стоит рассмотреть внешние сервисы рассылок, которые интегрируются с Google Таблицами через API – они снимают это ограничение.
MailApp или GmailApp
В Apps Script для отправки писем доступны два сервиса – MailApp и GmailApp. MailApp проще, требует меньше разрешений и реже просит повторную авторизацию. Письма, отправленные через него, не отображаются в папке «Отправленные» в Gmail. GmailApp предоставляет больше возможностей: отправку с псевдонимов, доступ к входящим, работу с черновиками, но требует расширенных разрешений к почтовому ящику и при изменении скрипта чаще запрашивает повторное подтверждение от пользователя.
Для большинства задач по рассылке из таблицы MailApp – оптимальный выбор. GmailApp имеет смысл использовать тогда, когда помимо отправки нужно еще и читать входящие, работать с черновиками или отправлять письма от имени другого адреса, добавленного как псевдоним в настройках Gmail.
Комментарии