Telegraft

Интеграция

Таблица, которую ваша команда и так ведёт каждый день

Интеграция с Google Sheets позволяет Telegram-боту читать настройки и писать записи в таблицу, которую ваша команда уже ведёт. Для многих небольших операций это правильная первая интеграция и неправильная постоянная: потолок здесь — одновременная запись, и он наступает раньше, чем принято ожидать.

Google Sheets — интеграция: доступ, лимиты и доступность

Модель авторизации
OAuth 2.0
Квота
Поминутные квоты на чтение и запись: на проект и на пользователя
Доступность в Заливе
Региональных ограничений нет
Поток данных
5 узлов, всё через воркер

As of 2025-10-01, Telegram Bot API 13.4

Зачем нужна эта интеграция

Поразительное число компаний Залива живёт на одной таблице, и считать это недостатком — значит неверно читать ситуацию. Таблица работает потому, что её видят все, никого не нужно обучать, а чтобы что-то в ней поменять, не требуется заявка. Бот, который требует завести настоящую базу данных прежде, чем начнёт приносить хоть какую-то пользу, — это бот, которого не построят.

Поэтому для первой версии Google Sheets часто и есть верная интеграция. Бот читает меню, прайс или график дежурств из таблицы, которую менеджер и так правит, а заказы или заявки пишет на соседнюю вкладку. Никому не приходится осваивать новую систему, и рабочая реальность — то, что кто-то меняет цены в четверг после обеда, — сохраняется, а не преодолевается.

Потолок здесь настоящий, и назвать его стоит заранее. Sheets API — это не база данных: одновременные дозаписи могут перемешаться, транзакций нет, а чтение-изменение-запись по диапазону — это гонка. Бот, который пишет несколько строк в час, чувствует себя прекрасно. Бот, который в обеденный час пишет по нескольку строк в секунду, соберёт таблицу с затёртыми и перемешанными строками, и симптомом будут пропавшие заказы, а не ошибка. Знать, где проходит эта граница, — значит перейти её осознанно и заранее, а не разбираться постфактум.

Как на самом деле движутся данные

Заказ в чатеTelegramпроверенный заказВоркер ботаисточник истиныЗапись в D1дозапись через очередьGoogle-таблицачитает таблицуВзгляд команды
Авторитетна база данных, а таблица — её проекция. Если писать сначала в таблицу, системой учёта становится она, и именно там проблемы одновременного доступа превращаются в потерю данных.

Сервисный аккаунт, которому таблицу выдали в доступ по его адресу: это проще и заметно долговечнее, чем OAuth от имени конкретного сотрудника, — доступ принадлежит интеграции, а не тому, кто её когда-то авторизовал. Ключ сервисного аккаунта лежит в секретах воркера, а сам аккаунт получает доступ к конкретным таблицам, а не ко всему диску.

Модель доступа: OAuth 2.0

Их лимиты и что они означают для вас

Sheets API применяет поминутные квоты на чтение и запись — отдельно на проект и отдельно на пользователя.

Всплеск записей упирается в поминутный лимит раньше, чем в суточный. Дозаписи ставятся в очередь и объединяются в пакеты вместо отправки по событию, что заодно снижает риск перемешивания строк.

Транзакций нет, и одновременные дозаписи в один диапазон могут перемешаться.

Две записи, пришедшие вместе, дают строку с полями от обеих. Это и есть жёсткий потолок таблицы как приёмника записи, и проявляется он испорченными строками, а не ошибкой.

У таблицы есть жёсткий предел числа ячеек, измеряемый миллионами по всем листам.

Журнал с большим оборотом рано или поздно до него дойдёт. Ротацию или архивирование планируют заранее, а не обнаруживают в момент, когда запись перестала проходить.

Значения, записанные строкой, таблица может молча переосмыслить по собственному форматированию.

Телефоны теряют ведущие нули, а номера заказов превращаются в даты. Форматы задаются на целевых столбцах явно, потому что поведение по умолчанию уверенно неверно.

Как это ломается и что происходит потом

Два заказа дозаписываются в один и тот же момент, и одна строка оказывается испорчена.

Дозаписи выстраиваются в очередь, а не отправляются параллельно. Именно этот сбой заставляет людей перестать доверять всей интеграции, и он полностью предотвратим.

Кто-то сортирует или удаляет строки, пока бот пишет.

Номера строк уезжают у бота под руками. Поэтому запись делается дозаписью в конец, а не по позиции, а чтение сопоставляется по ключевому столбцу, а не по номеру строки.

Менеджер переименовал вкладку.

Чтение ломается сразу и громко — и это лучший исход: альтернатива в том, что бот читает не ту вкладку и уверенно называет вчерашние цены.

Таблицу забрали у сервисного аккаунта.

Все операции падают разом. Воркер проверяет доступ на старте, поэтому это видно как ошибка деплоя, а не как тихая остановка.

Доступность в ОАЭ и остальных странах Залива

Весь мир

Региональных ограничений нет. Достаточно аккаунта Google или домена в Workspace.

Небольшие компании

Тот самый случай, ради которого всё и делается, и здесь эта интеграция оправдывает своё место. Она сохраняет то, как команда уже работает, вместо того чтобы это заменять.

Высокая частота записи

Не подходит. Дальше нескольких записей в секунду перемешивание строк оборачивается потерей данных, и честный совет — перенести запись в базу, а таблицу оставить представлением.

Учёт под регуляторными требованиями

Таблица, которую может править кто угодно, — плохой аудиторский след. Там, где записи должны быть защищены от незаметного изменения, записью считается база, а таблица остаётся удобством.

Когда эту интеграцию делать не нужно

  • Вы пишете больше нескольких строк в секунду. Перемешивание даёт испорченные строки, а симптомом будут пропавшие заказы, а не сообщение об ошибке.
  • Таблица должна быть системой учёта для чего-либо денежного. Любой, у кого есть доступ, может править историю, а это не аудиторский след.
  • Один и тот же диапазон правят несколько человек, пока бот в него пишет. Номера строк уезжают, и чтение начинает возвращать не то.
  • У вас уже есть база данных, а таблицу добавляют для удобства. Тогда таблица должна быть проекцией только на чтение, а не вторым пишущим.

На чём это работает

КомпонентВерсияЗачем
Cloudflare WorkerscurrentАвторизация сервисного аккаунта, дозаписи через очередь и пакетное чтение.
Cloudflare D1currentНастоящий источник истины, который проецируется в таблицу.
Cloudflare KVcurrentКеш настроек, прочитанных из таблицы, с обновлением по расписанию.
Zod4.4Валидация настроек из таблицы, которую люди правят как им удобно.

Вопросы, которые возникают при оценке

Таблица — это вообще приемлемая интеграция?

Для небольшой компании — часто да, и отмахнуться от неё обычно означает, что бота просто не построят. Таблица работает потому, что её видят все и никого не нужно обучать. Важно знать, где у неё потолок, а не делать вид, что его нет.

Где именно проходит этот потолок у Google Sheets?

На одновременной записи. Транзакций нет, поэтому две дозаписи, пришедшие вместе, могут слиться в одну испорченную строку. Несколько строк в час — спокойно; несколько строк в секунду в час пик — уже нет, и симптомом будут пропавшие заказы, а не сообщение об ошибке.

Куда боту писать — в таблицу или в базу данных?

В базу, а таблицу держать её проекцией. Если писать сначала в таблицу, системой учёта становится она, и ровно там проблемы одновременного доступа превращаются в потерю данных, которую потом не восстановить.

Почему у телефонов пропадают ведущие нули?

Таблица переосмысливает значения по форматированию столбца, и поведение по умолчанию для идентификаторов уверенно неверно. Форматы на целевых столбцах задаются явно ещё при настройке.

Что происходит, когда кто-то сортирует таблицу?

Номера строк уезжают у бота под руками — поэтому запись идёт дозаписью в конец, а не по позиции, а чтение сопоставляется по ключевому столбцу. Расчёт на стабильные номера строк — вторая по распространённости ошибка в таких интеграциях.

Сервисный аккаунт или OAuth от имени сотрудника?

Сервисный аккаунт, которому таблицу выдали по его адресу. Доступ принадлежит интеграции, а не тому, кто её авторизовал, поэтому он переживает уход человека, который всё настраивал.

Что почитать дальше