Определите, что считается одной записью
Если таблица хранит заявки, одна строка должна соответствовать понятной сущности. Например, новое сообщение с номером заказа создаёт заявку, а его редактирование обновляет существующую запись. У события Telegram есть update_id, который помогает распознавать повторную доставку. Для самого сообщения полезна связка идентификатора чата и идентификатора сообщения. Это разные ключи: одно сообщение может породить новое событие после изменения. Заранее выберите поведение при редактировании и неподдерживаемом содержимом, например стикере вместо текста. Без такого решения система будет случайно смешивать журнал событий и текущий список заявок.
Проверяйте входные данные до добавления строки
Сообщение пользователя не обязано соответствовать ожидаемому шаблону. В нём может отсутствовать номер заказа, дата может быть неоднозначной, а сумма — содержать лишние символы. Отделите исходный текст от разобранных полей и результата проверки. Например, для учебной заявки достаточно кода, краткого описания и статуса обработки; не нужно собирать дополнительные личные сведения без цели. Некорректное событие лучше направить в понятный процесс уточнения или проверки, чем незаметно записать пустую строку. Время храните с явно выбранным часовым поясом, чтобы события из разных суток не путались.
Добавление строки не обеспечивает защиту от повторов
Метод добавления значений в Google Sheets ищет таблицу в указанном диапазоне и записывает данные после её последней строки. Он не знает, что конкретное событие уже обрабатывалось вашим приложением. Поэтому необходим собственный учёт идентификаторов и согласованный порядок записи. При параллельной обработке два исполнителя могут одновременно не найти событие и оба добавить строку; одного предварительного поиска недостаточно. Нужен механизм, который исключает такую гонку. Если ответ на запись потерялся, повторять добавление вслепую нельзя: сначала сверяют сохранённый идентификатор и фактическое состояние таблицы.
Храните текст как текст и проверяйте результат
В режиме RAW значения не разбираются как пользовательский ввод; режим USER_ENTERED может интерпретировать строки как формулы, числа или даты. Для произвольного текста сообщений выбор режима важен: содержимое не должно неожиданно становиться вычислением. Доступ к таблице и секретам интеграции ограничивают необходимыми полномочиями, а токены не помещают в ячейки и журналы с общим доступом. Успешный ответ подтверждает конкретную операцию, но полезно также сохранять идентификатор события и сведения о записанном диапазоне. Тогда ошибку можно разбирать по фактам, не создавая ещё одну строку ради проверки.
Попробуйте на практике
Проверьте логику переноса на бумаге или в локальном файле. Подключать бота, выдавать доступы и использовать реальные сообщения не требуется.
- Придумайте три события: новую заявку, повтор того же события и редактирование исходного сообщения. Для каждого запишите идентификатор события, чата и сообщения.
- Определите столбцы будущей таблицы и ожидаемое действие для каждого события. Повтор не должен создавать вторую заявку.
- Добавьте четвёртый сценарий: запись выполнена, но ответ потерян. Опишите, по какому ключу проверите результат перед повторной попыткой.
- Проверьте текст, похожий на формулу, и сообщение без обязательного поля. Запишите ожидаемое безопасное поведение для обоих случаев.
Как проверить результат. После всех сценариев число заявок соответствует смыслу событий. Повторная доставка и потерянный ответ не приводят к неконтролируемому добавлению строк.
Частые вопросы
Можно ли использовать только время сообщения как ключ?
Это ненадёжно: разные сообщения могут иметь одинаковое время. Лучше использовать предусмотренные системой идентификаторы и явно определить, различаете ли вы события или сообщения.
Нужно ли сразу писать собственную программу?
Не обязательно. Визуальный сервис автоматизации тоже подходит, если позволяет реализовать проверки, учёт повторов и восстановление после сбоя. Эти требования сохраняются независимо от инструмента.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.