Короче: логика внутри Google Таблиц — рассылки, KPI-письма, бот из листа, без своего сервера.
Задача: сроки сдвигаются, KPI не сходится с планом, мероприятия надо напоминать — а править должен тот, кто ведёт лист, не разработчик. Скрипты живут в проекте таблицы; наружу уходят только Gmail и Telegram, где это нужно.
- Рассылка по срокам — правила по типам объектов, чанки писем, тестовый режим.
- Два контура — обёртки с разными флагами, один движок
dispatch.gs. - KPI-рассылка — расхождения с внешним планом, HTML-таблица в письме.
- Бот мероприятий — строки таблицы → напоминания в Telegram, модерация доступа.
- ImportRangeRetry — повтор импорта, если Google отдал ошибку.
- Snapshot книги — копия нужных вкладок на Drive по whitelist.
| Фишка | Зачем |
|---|---|
| Меню в таблице | Запуск без редактора скриптов |
| Тестовый флаг рассылки | Прогон на свои адреса до «боя» |
| Чанки писем | Не упираемся в лимиты Gmail |
| Именованный диапазон получателей | KPI — без хардкода email в коде |
active / галочка «отправить» |
Строка в данных, не в скрипте |
| Webhook + time-driven | Бот отвечает и шлёт по календарю |
Плюс: нет VPS под бизнес-логику таблицы — квоты и права те же, что у Google Workspace.
flowchart TB
subgraph sheets ["Листы таблицы"]
R["Правила рассылки"]
C["Изменения сроков"]
K["KPI / внешний план"]
E["Мероприятия"]
S["Подписчики"]
end
subgraph gas ["Apps Script"]
D["dispatch.gs"]
M["milestone_mail.gs"]
B["event_reminder_bot.gs"]
I["import_range_retry.gs"]
W["workbook_snapshot.gs"]
end
R --> D
C --> D
D --> GMAIL["Gmail"]
K --> M
M --> GMAIL
E --> B
S --> B
B --> TG["Telegram API"]
I --> sheets
W --> DRIVE["Google Drive"]
Идея: таблица — источник правды; скрипт только читает, форматирует и шлёт.
flowchart LR
A["Обновили сроки\nна листе"] --> B{"Рассылка\nпо расписанию?"}
B -->|да| C["Письмо с таблицей\nв Gmail"]
B -->|KPI| D["milestone_mail\n→ письмо"]
E["Строка мероприятия"] --> F["Напоминание\nв Telegram"]
C --> G["Получатель\nкликает / читает"]
F --> G
Администратор / редактор:
flowchart TD
R1["Правка листа\nили правил"] --> R2["Меню → запуск\nили триггер"]
R2 --> R3["Executions\nв Apps Script"]
R3 --> R4["При ошибке —\nлог + тестовый режим"]
| Слой | Технология |
|---|---|
| Данные | Google Sheets |
| Логика | Google Apps Script |
| Почта | GmailApp |
| Бот | UrlFetchApp → Telegram API |
| Триггеры | time-driven, меню, web app doPost |
README.md
LICENSE
.gitignore
apps-script/ — dispatch.gs, milestone_mail.gs, …
docs/ — DATA-SCHEMA.md, DESIGN-EDGE-CASES.md, DIAGRAMS.md
examples/ — script_properties.example.json
- Открыть проект Apps Script таблицы.
- Вставить
.gsиз репозитория (плейсхолдерыYOUR_*вместо токенов и ID). - Рассылка: настроить триггер или пункт меню.
- Бот мероприятий: Deploy → Web app → первичная настройка webhook.
Секреты — только вне git (локальный config или Properties Service).