Что такое 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.

СервисК чему даёт доступТипичная задача
SpreadsheetAppGoogle Таблицыпрочитать лист, записать значения, покрасить ячейку
GmailAppGmailотправить письмо, найти письма по запросу, забрать вложение
DriveAppGoogle Дисксоздать папку, найти файл, выдать доступ
DocumentAppGoogle Документысобрать договор из шаблона
CalendarAppКалендарьсоздать встречу, выгрузить события за неделю
FormAppGoogle Формыпрочитать ответы, собрать форму программно
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 ApplicationsJavaScript (движок 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 часов
Получателей писем в сутки1001 500
Вызовов UrlFetchApp в сутки20 000100 000
Создано документов в сутки2501 500
Триггеров на скрипт для пользователя2020

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

Отдельно про 6 минут. Если выполнение длится дольше, Google обрывает его с ошибкой Exceeded maximum execution time. Это не баг, а дисциплина: ограничение заставляет писать быстрый код и разбивать тяжёлые задачи на порции.

Как это работает

Когда вы нажимаете «Выполнить», происходит вот что.

  1. Код уезжает на серверы Google и запускается там в изолированной среде V8. Ваш браузер ничего не считает — он только показывает журнал.
  2. Скрипт выполняется от вашего имени. Не от имени безликого сервисного бота, а именно вашего аккаунта. Поэтому он видит ровно те файлы и письма, которые видите вы, — и ни файлом больше.
  3. Перед первым запуском Google спрашивает разрешения (OAuth-согласие): «этот скрипт хочет управлять вашими таблицами — разрешаете?». Об этом экране — следующий урок.
  4. Каждое обращение к 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 нет: вместо fetchUrlFetchApp, вместо alertSpreadsheetApp.getUi().alert().
  • В отличие от VBA, скрипт работает, даже когда ваш компьютер выключен, — по триггерам-расписаниям.
  • Платите не деньгами, а квотами: 6 минут на одно выполнение, 90 минут триггеров в сутки и 100 получателей писем на личном аккаунте (в Workspace лимиты выше).
  • Каждое обращение к сервису — сетевой вызов. Отсюда главное правило производительности: читать и писать диапазоном, а не по ячейке.
Проверьте себя
1. Почему в Apps Script не работают fetch() и document.querySelector()?
AGoogle намеренно отключил их ради безопасности, но их можно включить в настройках проекта
BКод выполняется на серверах Google, а не в браузере, — браузерного окружения там нет
CОни работают, но только в привязанных к таблице скриптах
DИх нужно подключить как внешнюю библиотеку через npm
2. Чем Apps Script принципиально отличается от VBA в Excel?
AОн быстрее работает с ячейками, потому что не тратит память компьютера
BОн умеет выполняться по расписанию, даже когда ваш компьютер выключен
CОн не требует авторизации для доступа к вашей почте и диску
DВ нём нет ограничений на время выполнения скрипта