Что такое Apps Script и зачем он
Apps Script — это JavaScript, который живёт в облаке Google и имеет ключи от ваших таблиц, почты и диска. Разбираемся, что он умеет, чем отличается от VBA и во сколько обходится.
Google Apps Script — облачная платформа Google, где вы пишете код на JavaScript, а выполняется он на серверах Google и через встроенные сервисы (
SpreadsheetApp,GmailApp,DriveApp,CalendarApp) управляет вашими же документами от вашего имени.
Зачем он вообще нужен
Представьте типичное утро аналитика или бухгалтера. Открыть таблицу с заявками, отфильтровать вчерашние, посчитать суммы по менеджерам, скопировать итог в сводный лист, покрасить просроченные строки красным, отправить письмо руководителю. Сорок минут аккуратной, скучной и легко ошибающейся работы — и так каждый день.
Apps Script превращает эти сорок минут в одну кнопку. А если повесить скрипт на расписание — то вообще ни в одну: в 9:00 письмо уже лежит в почте руководителя, пока вы наливаете кофе.
Вот как выглядит такой скрипт целиком. Не пытайтесь пока разобрать его построчно — просто оцените масштаб.
function utrenniyOtchet() {
const list = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Заявки');
const stroki = list.getDataRange().getValues();
let summa = 0;
for (let i = 1; i < stroki.length; i++) { // i = 1 — пропускаем шапку
summa += Number(stroki[i][3]) || 0; // 4-й столбец — сумма заявки
}
GmailApp.sendEmail(
'[email protected]',
'Заявки за вчера',
'Заявок: ' + (stroki.length - 1) + '. Сумма: ' + summa + ' руб.'
);
}Двенадцать строк — и рутина исчезла. Никаких установок, плагинов и системного администратора: всё, что нужно, — браузер и аккаунт Google.
Из чего состоит Apps Script
1. Обычный современный JavaScript
Под капотом — движок V8, тот же самый, что в Chrome. Значит, вам доступен полноценный ES6+: const и let, стрелочные функции, шаблонные строки, деструктуризация, map/filter/reduce, классы, try/catch. Если вы знаете JavaScript, половину Apps Script вы уже знаете.
const summy = [3000, 7000, 11000, 2000];
const krupnye = summy.filter(s => s > 5000).map(s => s / 1000);
console.log(krupnye); // [7, 11]2. Сервисы Google
Это то, чего нет и не может быть в браузерном JavaScript. Сервис — глобальный объект-ключ к одному продукту Google.
| Сервис | К чему даёт доступ | Типичная задача |
SpreadsheetApp | Google Таблицы | прочитать лист, записать значения, покрасить ячейку |
GmailApp | Gmail | отправить письмо, найти письма по запросу, забрать вложение |
DriveApp | Google Диск | создать папку, найти файл, выдать доступ |
DocumentApp | Google Документы | собрать договор из шаблона |
CalendarApp | Календарь | создать встречу, выгрузить события за неделю |
FormApp | Google Формы | прочитать ответы, собрать форму программно |
UrlFetchApp | внешние HTTP-запросы | дёрнуть API курса валют или отправить сообщение в Telegram |
Обратите внимание на последнюю строку: в Apps Script нет привычного fetch(). Его роль играет UrlFetchApp.fetch(). Это очень характерный пример: платформа похожа на браузер, но браузером не является.
3. Триггеры
Триггер — правило «когда запускать скрипт без человека». Их три вида: простые (onOpen — при открытии таблицы, onEdit — при правке ячейки), устанавливаемые по событию (например, при отправке формы) и по времени («каждый день в 9:00», «каждые 15 минут»). Именно триггеры превращают скрипт из «кнопки для меня» в настоящую автоматизацию.
Apps Script против VBA: честное сравнение
Если вы пришли из мира Excel и макросов, вот главные отличия.
| Критерий | VBA (Excel) | Apps Script |
| Язык | Visual Basic for Applications | JavaScript (движок V8, ES6+) |
| Где выполняется | на вашем компьютере, внутри Excel | на серверах Google |
| Работает при выключенном компьютере | нет | да — по триггерам-расписаниям |
| Что нужно установить | Excel (и разрешить макросы) | ничего, только браузер |
| Совместная работа | файл живёт у одного человека | скрипт живёт вместе с общим документом |
| Почта, диск, календарь | через COM/Outlook, с костылями | штатные сервисы платформы |
| Ограничения | память и терпение вашего ПК | квоты Google и 6 минут на выполнение |
| Обращение к ячейке | операция в памяти, почти бесплатна | сетевой вызов к серверу — дорого |
Последняя строка — самая важная. Привычка «пробежать циклом по ячейкам» в Apps Script смертельна. В Excel Cells(i, 1).Value = x — это работа с памятью. В Apps Script getRange(i, 1).setValue(x) — это поход по сети. Тысяча ячеек означает тысячу походов и минуты ожидания. Мы разберём это подробно в третьем уроке, но запомните прямо сейчас.
Сколько это стоит: квоты вместо денег
Apps Script бесплатен. Плату за выполнение не берут ни с личного аккаунта @gmail.com, ни с Google Workspace. Вместо денег Google ограничивает вас квотами — сколько операций в сутки можно израсходовать.
| Ограничение | Личный аккаунт | Google Workspace |
| Время одного выполнения | 6 минут | 6 минут |
| Суммарное время триггеров в сутки | 90 минут | 6 часов |
| Получателей писем в сутки | 100 | 1 500 |
Вызовов UrlFetchApp в сутки | 20 000 | 100 000 |
| Создано документов в сутки | 250 | 1 500 |
| Триггеров на скрипт для пользователя | 20 | 20 |
Google периодически пересматривает цифры, поэтому точные значения всегда сверяйте с официальной таблицей квот. Важнее порядок величин: для ежедневного отчёта, синхронизации нескольких сотен строк и десятка писем квот хватает с огромным запасом. А вот рассылка на 5 000 адресов или обработка миллиона строк — уже не задача для Apps Script.
Отдельно про 6 минут. Если выполнение длится дольше, Google обрывает его с ошибкой Exceeded maximum execution time. Это не баг, а дисциплина: ограничение заставляет писать быстрый код и разбивать тяжёлые задачи на порции.
Как это работает
Когда вы нажимаете «Выполнить», происходит вот что.
- Код уезжает на серверы Google и запускается там в изолированной среде V8. Ваш браузер ничего не считает — он только показывает журнал.
- Скрипт выполняется от вашего имени. Не от имени безликого сервисного бота, а именно вашего аккаунта. Поэтому он видит ровно те файлы и письма, которые видите вы, — и ни файлом больше.
- Перед первым запуском Google спрашивает разрешения (OAuth-согласие): «этот скрипт хочет управлять вашими таблицами — разрешаете?». Об этом экране — следующий урок.
- Каждое обращение к
SpreadsheetAppилиGmailApp— это внутренний сетевой вызов от сервера Apps Script к серверу соответствующего продукта.
Из пункта 1 следует, что в Apps Script нет window, document, alert() и localStorage: браузерного окружения здесь просто не существует. Из пункта 2 — что скрипт нельзя «спрятать»: если он рассылает письма, письма уйдут из вашего ящика и будут числиться за вами. Из пункта 4 — что скорость скрипта зависит не от того, сколько вы вычисляете, а от того, сколько раз дёргаете сервисы.
Частые ошибки
- Ждать браузерные API.
alert('готово'),document.querySelector,fetch— ничего этого нет. Аналоги:SpreadsheetApp.getUi().alert()иUrlFetchApp.fetch(). ОшибкаReferenceError: document is not defined— ровно про это. - Считать Apps Script заменой бэкенда. Он великолепен как «клей» между сервисами Google и как автоматизация офисной рутины. Он плох как нагруженный сервис: квоты, шестиминутный лимит, холодный старт.
- Переносить привычки VBA один в один. Цикл по ячейкам, который в Excel отрабатывал за секунду, здесь легко отвалится по таймауту.
- Не смотреть на квоты, пока не упало. Скрипт рассылки прекрасно работал на 20 адресатах, а на 120 внезапно падает с
Service invoked too many times for one day. Лимиты стоит прикинуть заранее. - Хранить секреты прямо в коде. Токен Telegram-бота, вписанный в файл скрипта, уедет вместе с копией таблицы, которой вы поделились с коллегой. Для секретов есть
PropertiesService.
Итоги
- Apps Script — это JavaScript (V8, ES6+), который выполняется на серверах Google и через сервисы
SpreadsheetApp,GmailApp,DriveAppуправляет вашими документами от вашего имени. - Браузерных API нет: вместо
fetch—UrlFetchApp, вместоalert—SpreadsheetApp.getUi().alert(). - В отличие от VBA, скрипт работает, даже когда ваш компьютер выключен, — по триггерам-расписаниям.
- Платите не деньгами, а квотами: 6 минут на одно выполнение, 90 минут триггеров в сутки и 100 получателей писем на личном аккаунте (в Workspace лимиты выше).
- Каждое обращение к сервису — сетевой вызов. Отсюда главное правило производительности: читать и писать диапазоном, а не по ячейке.