Интеграция
Таблица, которую ваша команда и так ведёт каждый день
Интеграция с Google Sheets позволяет Telegram-боту читать настройки и писать записи в таблицу, которую ваша команда уже ведёт. Для многих небольших операций это правильная первая интеграция и неправильная постоянная: потолок здесь — одновременная запись, и он наступает раньше, чем принято ожидать.
Google Sheets — интеграция: доступ, лимиты и доступность
- Модель авторизации
- OAuth 2.0
- Квота
- Поминутные квоты на чтение и запись: на проект и на пользователя
- Доступность в Заливе
- Региональных ограничений нет
- Поток данных
- 5 узлов, всё через воркер
As of 2025-10-01, Telegram Bot API 13.4
Зачем нужна эта интеграция
Поразительное число компаний Залива живёт на одной таблице, и считать это недостатком — значит неверно читать ситуацию. Таблица работает потому, что её видят все, никого не нужно обучать, а чтобы что-то в ней поменять, не требуется заявка. Бот, который требует завести настоящую базу данных прежде, чем начнёт приносить хоть какую-то пользу, — это бот, которого не построят.
Поэтому для первой версии Google Sheets часто и есть верная интеграция. Бот читает меню, прайс или график дежурств из таблицы, которую менеджер и так правит, а заказы или заявки пишет на соседнюю вкладку. Никому не приходится осваивать новую систему, и рабочая реальность — то, что кто-то меняет цены в четверг после обеда, — сохраняется, а не преодолевается.
Потолок здесь настоящий, и назвать его стоит заранее. Sheets API — это не база данных: одновременные дозаписи могут перемешаться, транзакций нет, а чтение-изменение-запись по диапазону — это гонка. Бот, который пишет несколько строк в час, чувствует себя прекрасно. Бот, который в обеденный час пишет по нескольку строк в секунду, соберёт таблицу с затёртыми и перемешанными строками, и симптомом будут пропавшие заказы, а не ошибка. Знать, где проходит эта граница, — значит перейти её осознанно и заранее, а не разбираться постфактум.
Как на самом деле движутся данные
Сервисный аккаунт, которому таблицу выдали в доступ по его адресу: это проще и заметно долговечнее, чем OAuth от имени конкретного сотрудника, — доступ принадлежит интеграции, а не тому, кто её когда-то авторизовал. Ключ сервисного аккаунта лежит в секретах воркера, а сам аккаунт получает доступ к конкретным таблицам, а не ко всему диску.
Модель доступа: OAuth 2.0
Их лимиты и что они означают для вас
Sheets API применяет поминутные квоты на чтение и запись — отдельно на проект и отдельно на пользователя.
Всплеск записей упирается в поминутный лимит раньше, чем в суточный. Дозаписи ставятся в очередь и объединяются в пакеты вместо отправки по событию, что заодно снижает риск перемешивания строк.
Транзакций нет, и одновременные дозаписи в один диапазон могут перемешаться.
Две записи, пришедшие вместе, дают строку с полями от обеих. Это и есть жёсткий потолок таблицы как приёмника записи, и проявляется он испорченными строками, а не ошибкой.
У таблицы есть жёсткий предел числа ячеек, измеряемый миллионами по всем листам.
Журнал с большим оборотом рано или поздно до него дойдёт. Ротацию или архивирование планируют заранее, а не обнаруживают в момент, когда запись перестала проходить.
Значения, записанные строкой, таблица может молча переосмыслить по собственному форматированию.
Телефоны теряют ведущие нули, а номера заказов превращаются в даты. Форматы задаются на целевых столбцах явно, потому что поведение по умолчанию уверенно неверно.
Как это ломается и что происходит потом
Два заказа дозаписываются в один и тот же момент, и одна строка оказывается испорчена.
Дозаписи выстраиваются в очередь, а не отправляются параллельно. Именно этот сбой заставляет людей перестать доверять всей интеграции, и он полностью предотвратим.
Кто-то сортирует или удаляет строки, пока бот пишет.
Номера строк уезжают у бота под руками. Поэтому запись делается дозаписью в конец, а не по позиции, а чтение сопоставляется по ключевому столбцу, а не по номеру строки.
Менеджер переименовал вкладку.
Чтение ломается сразу и громко — и это лучший исход: альтернатива в том, что бот читает не ту вкладку и уверенно называет вчерашние цены.
Таблицу забрали у сервисного аккаунта.
Все операции падают разом. Воркер проверяет доступ на старте, поэтому это видно как ошибка деплоя, а не как тихая остановка.
Доступность в ОАЭ и остальных странах Залива
Весь мир
Региональных ограничений нет. Достаточно аккаунта Google или домена в Workspace.
Небольшие компании
Тот самый случай, ради которого всё и делается, и здесь эта интеграция оправдывает своё место. Она сохраняет то, как команда уже работает, вместо того чтобы это заменять.
Высокая частота записи
Не подходит. Дальше нескольких записей в секунду перемешивание строк оборачивается потерей данных, и честный совет — перенести запись в базу, а таблицу оставить представлением.
Учёт под регуляторными требованиями
Таблица, которую может править кто угодно, — плохой аудиторский след. Там, где записи должны быть защищены от незаметного изменения, записью считается база, а таблица остаётся удобством.
Когда эту интеграцию делать не нужно
- Вы пишете больше нескольких строк в секунду. Перемешивание даёт испорченные строки, а симптомом будут пропавшие заказы, а не сообщение об ошибке.
- Таблица должна быть системой учёта для чего-либо денежного. Любой, у кого есть доступ, может править историю, а это не аудиторский след.
- Один и тот же диапазон правят несколько человек, пока бот в него пишет. Номера строк уезжают, и чтение начинает возвращать не то.
- У вас уже есть база данных, а таблицу добавляют для удобства. Тогда таблица должна быть проекцией только на чтение, а не вторым пишущим.
На чём это работает
| Компонент | Версия | Зачем |
|---|---|---|
| Cloudflare Workers | current | Авторизация сервисного аккаунта, дозаписи через очередь и пакетное чтение. |
| Cloudflare D1 | current | Настоящий источник истины, который проецируется в таблицу. |
| Cloudflare KV | current | Кеш настроек, прочитанных из таблицы, с обновлением по расписанию. |
| Zod | 4.4 | Валидация настроек из таблицы, которую люди правят как им удобно. |
Вопросы, которые возникают при оценке
Таблица — это вообще приемлемая интеграция?
Для небольшой компании — часто да, и отмахнуться от неё обычно означает, что бота просто не построят. Таблица работает потому, что её видят все и никого не нужно обучать. Важно знать, где у неё потолок, а не делать вид, что его нет.
Где именно проходит этот потолок у Google Sheets?
На одновременной записи. Транзакций нет, поэтому две дозаписи, пришедшие вместе, могут слиться в одну испорченную строку. Несколько строк в час — спокойно; несколько строк в секунду в час пик — уже нет, и симптомом будут пропавшие заказы, а не сообщение об ошибке.
Куда боту писать — в таблицу или в базу данных?
В базу, а таблицу держать её проекцией. Если писать сначала в таблицу, системой учёта становится она, и ровно там проблемы одновременного доступа превращаются в потерю данных, которую потом не восстановить.
Почему у телефонов пропадают ведущие нули?
Таблица переосмысливает значения по форматированию столбца, и поведение по умолчанию для идентификаторов уверенно неверно. Форматы на целевых столбцах задаются явно ещё при настройке.
Что происходит, когда кто-то сортирует таблицу?
Номера строк уезжают у бота под руками — поэтому запись идёт дозаписью в конец, а не по позиции, а чтение сопоставляется по ключевому столбцу. Расчёт на стабильные номера строк — вторая по распространённости ошибка в таких интеграциях.
Сервисный аккаунт или OAuth от имени сотрудника?
Сервисный аккаунт, которому таблицу выдали по его адресу. Доступ принадлежит интеграции, а не тому, кто её авторизовал, поэтому он переживает уход человека, который всё настраивал.
Что почитать дальше
Если нужны структурированные записи с настоящими типами полей и полноценным API, посмотрите на интеграцию с Airtable.
Когда таблица — лишь один шаг в длинной цепочке автоматизации, смотрите интеграцию с Zapier.
Чаще всего на таблице поначалу держится бот приёма заказов в ресторане.
Графики дежурств, которые ведут в таблице, — нормальная отправная точка для бота рассылки уведомлений.