Автоматическая почасовая отправка Google Sheets-отчёта в XLSX по email

Google Apps Script-автоматизация, которая каждый час экспортирует Google Таблицу в XLSX-файл и отправляет его на заданные email-адреса.

Автоматическая почасовая отправка Google Sheets-отчёта в XLSX по email — фото 1
нажмите для просмотра в полном размере

Слайд 1 из 2

ОПИСАНИЕ

Проект реализован как скрипт Google Apps Script для автоматической почасовой отправки отчёта из Google Sheets в формате Excel. В коде используется ID Google Таблицы, список получателей, имя итогового файла, тема письма и флаг режима отправки, который определяет, нужно ли запускать рассылку ровно в начале каждого часа.

Экспорт и отправка отчёта

Основная функция отправки `doSend_()` открывает Google Таблицу по `SHEET_ID`, формирует URL экспорта через стандартный endpoint Google Sheets `/export?format=xlsx`, получает XLSX-файл через `UrlFetchApp.fetch()` и авторизует запрос OAuth-токеном текущего скрипта через `ScriptApp.getOAuthToken()`. Полученный ответ преобразуется в blob, файлу задаётся имя `KSclay.xlsx`, после чего он отправляется через `MailApp.sendEmail()` как вложение двум получателям.

Расписание по триггерам

Для расписания реализована отдельная логика управления time-based триггерами. Функция `nextTopOfHour_()` вычисляет ближайший следующий ровный час: сбрасывает минуты, секунды и миллисекунды до нуля, а если рассчитанное время уже прошло или совпадает с текущим моментом, переносит запуск на следующий час. Это позволяет не использовать приблизительный `everyHours(1)` в режиме точной отправки, а каждый раз создавать одноразовый триггер на конкретное время.

Структура и очистка триггеров

Архитектура скрипта разделена на несколько служебных функций: отправка письма, расчёт следующего запуска, очистка триггеров, проверка существующих триггеров, настройка расписания, обработчик почасового запуска и ручной тест. Для предотвращения дублей предусмотрена очистка только связанных со скриптом триггеров через `clearOurTriggers_()`. Она удаляет обработчики `tick_`, `doSend_` и старые обработчики, начинающиеся с `sendAt_`. Также есть отдельная аварийная функция `wipeAllTriggers()`, которая удаляет все триггеры проекта целиком.

Режим точной отправки

В режиме `EXACT_ON_THE_HOUR = true` используется обработчик `tick_()`. Он выполняет отправку отчёта через `doSend_()`, а затем в блоке `finally` удаляет текущие триггеры `tick_` и создаёт новый одноразовый триггер на следующий ровный час. Такой подход гарантирует, что переназначение следующего запуска произойдёт даже в случае ошибки внутри отправки, насколько это позволяет выполнение блока `finally`.

Первичная настройка и тест

Для первичной настройки используется функция `setupOnce()`: её нужно запустить вручную один раз, чтобы скрипт поставил первый триггер. Для ручной проверки предусмотрена функция `testNow()`, которая сразу вызывает отправку письма без ожидания расписания. В коде нет внешних npm-зависимостей, package.json, базы данных, пользовательского интерфейса или отдельного слоя данных; проект полностью построен на встроенных сервисах Google Apps Script.

ИСПОЛЬЗУЕМЫЕ ИНСТРУМЕНТЫ

  • Google Apps Script
  • JavaScript
  • Google Sheets API export endpoint
  • SpreadsheetApp
  • UrlFetchApp
  • ScriptApp
  • MailApp
  • time-based triggers
  • OAuth token Google Apps Script

РЕЗУЛЬТАТ

  • Реализована автоматическая отправка Google Таблицы в формате XLSX на несколько email-адресов.
  • Настроен экспорт Google Sheets через `/export?format=xlsx` с авторизацией OAuth-токеном скрипта.
  • Реализована отправка Excel-файла как email-вложения через `MailApp.sendEmail()`.
  • Добавлен режим отправки ровно в 00 минут каждого часа через одноразовые time-based триггеры.
  • Реализован расчёт ближайшего следующего ровного часа для точного планирования запусков.
  • Добавлена автоматическая пересборка триггера после каждого выполнения обработчика `tick_()`.
  • Предусмотрена очистка старых и дублирующихся триггеров, связанных с этим скриптом.
  • Добавлена аварийная функция полной очистки триггеров проекта.
  • Добавлена функция ручной инициализации расписания `setupOnce()`.
  • Добавлена функция ручной тестовой отправки `testNow()` без ожидания следующего часа.

AI АССИСТЕНТ

Задать вопрос по этой работе