Бот Telegram записывает в таблицу
Пользователь пишет боту в Telegram, сообщение появляется строкой в таблице, бот отвечает «Записали». Так можно собирать заявки, показания, отчёты сотрудников или заказы без своего сервера: бот работает через вебхук скрипта.
Что понадобится:
- таблица Coverse на тарифе «Бизнес» или выше;
- бот Telegram и его токен;
- 10 минут.
Если нужно наоборот, присылать в Telegram уведомления из таблицы, смотрите Внешние сервисы.
1. Создайте бота
- В Telegram откройте @BotFather и отправьте команду
/newbot. - Задайте имя и адрес бота, BotFather пришлёт токен вида
123456789:AA…. - В редакторе скрипта на вкладке «Секреты» добавьте секрет
TELEGRAM_BOT_TOKENс этим токеном.
2. Код скрипта
const SHEET = "Сообщения бота";
const HOOK_URL = "https://app.coverse.team/api/hooks/scripts/whs_…";
function onWebhook(event) {
if (!event || !event.json) return;
const update = event.json;
const message = update.message;
if (!message || !message.chat) return;
const sheet = Coverse.table.getSheetByName(SHEET) || Coverse.table.insertSheet(SHEET);
if (sheet.getLastRow() === 0) {
sheet.appendRow(["update_id", "Дата", "ID пользователя", "Имя", "Логин", "Телефон", "Текст"]);
}
const ids = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues().map((row) => String(row[0]));
if (ids.includes(String(update.update_id))) return;
if (message.text === "/start") {
Telegram.send(message.chat.id, "Здравствуйте! Напишите сообщение, и мы его запишем.");
return;
}
const from = message.from || {};
sheet.appendRow([
update.update_id,
new Date(message.date * 1000),
from.id || "",
asText([from.first_name, from.last_name].filter(Boolean).join(" ")),
asText(from.username ? "@" + from.username : ""),
asText(message.contact ? message.contact.phone_number : ""),
asText(message.text || message.caption || ""),
]);
Telegram.send(message.chat.id, "Записали, спасибо!");
}
function connect() {
const token = Secrets.get("TELEGRAM_BOT_TOKEN");
if (!token) throw new Error("Добавьте секрет TELEGRAM_BOT_TOKEN");
const response = Http.post("https://api.telegram.org/bot" + token + "/setWebhook", {
url: HOOK_URL,
allowed_updates: ["message"],
drop_pending_updates: true,
});
console.log("Telegram ответил:", response.text());
}
function status() {
const response = Http.get("https://api.telegram.org/bot" + Secrets.get("TELEGRAM_BOT_TOKEN") + "/getWebhookInfo");
const info = response.json().result || {};
console.log("Подключён:", Boolean(info.url), "ждут доставки:", info.pending_update_count, "последняя ошибка:", info.last_error_message || "нет");
}
function asText(value) {
const text = String(value === undefined || value === null ? "" : value);
return text.charAt(0) === "=" ? "'" + text : text;
}
Сохраните скрипт.
3. Создайте адрес вебхука и подключите бота
- На вкладке «Триггеры» добавьте «По вебхуку» с функцией
onWebhook. - Скопируйте адрес вида
https://app.coverse.team/api/hooks/scripts/whs_…и вставьте его вHOOK_URLв коде. Telegram не умеет передавать заголовокX-Coverse-Token, поэтому нужен именно адрес с секретом. - В поле «Разрешённые IP-адреса» триггера укажите адреса, с которых Telegram отправляет запросы:
149.154.160.0/20, 91.108.4.0/22. Telegram предупреждает, что список может меняться: актуальный — в документации Telegram. - Сохраните скрипт, выберите функцию
connectи нажмите «Запустить». В журнале должно быть{"ok":true,"result":true,"description":"Webhook was set"}.
Готово: напишите боту, через несколько секунд сообщение появится на листе «Сообщения бота».
Как это работает
- Telegram отправляет каждое новое сообщение на адрес вебхука в формате JSON. Coverse сразу отвечает
200 OK, и Telegram считает сообщение доставленным. - Скрипт записывает строку и отвечает пользователю через
Telegram.sendот имени того же бота. - Столбец «Телефон» заполняется, только когда пользователь сам поделился контактом через меню вложений Telegram. Попросить номер кнопкой
Telegram.sendне умеет: для этого нужен запрос к Telegram черезHttp.post. - Функция
statusвыводит в журнал только состояние подключения, без адреса вебхука: журнал видят все редакторы таблицы. - Если запрос придёт повторно, скрипт найдёт
update_idв первом столбце и не запишет сообщение второй раз. allowed_updates: ["message"]просит Telegram присылать только новые сообщения, без правок, вступлений в группы и других событий.- Пока у бота подключён вебхук, другие программы не могут получать его сообщения через
getUpdates. Проверить подключение можно функциейstatus.
Идеи для своего бота
- Заявка в несколько шагов. Запоминайте в Памяти шаг для каждого
chat.id: сначала спросить имя, потом телефон, потом описание, и только затем записать строку. - Отчёт сотрудника. Записывайте сообщение на лист сотрудника по
from.idи ставьте отметку времени. - Ответ из таблицы. На сообщение «статус 1052» найдите заказ на листе и отправьте его статус.
Если что-то не работает
| Симптом | Причина | Что сделать |
|---|---|---|
в ответе connect ошибка Unauthorized | неверный токен бота | проверьте секрет TELEGRAM_BOT_TOKEN |
| бот молчит, в журнале скрипта нет запусков | бот не подключён или адрес отклоняется | запустите status: поле last_error_message покажет причину |
в status ошибка 403 Forbidden | адрес Telegram не входит в разрешённые IP-адреса | сверьте список с документацией Telegram |
| триггер выключился, пришло письмо | 20 запросов подряд отклонены, например из-за IP-адресов | исправьте список адресов и включите триггер |
| бот записывает, но не отвечает, в журнале «Telegram.send: токен бота неверный или отозван.» | неверный токен в секрете | сохраните верный токен в TELEGRAM_BOT_TOKEN |
| бот записывает, но не отвечает, в журнале «Telegram.send: токен бота не задан…» | секрета нет или он называется иначе | секрет должен называться TELEGRAM_BOT_TOKEN |
Частые вопросы
Можно ли сделать бота Telegram без своего сервера?
Да. Бот подключается к вебхуку скрипта Coverse одной функцией: сообщения пользователей записываются в таблицу, а бот отвечает через Telegram.send.
Как бот узнаёт телефон пользователя?
Телефон приходит, только если пользователь сам поделился контактом. Он записывается в столбец «Телефон».
Почему бот не отвечает?
Чаще всего неверный токен в секрете TELEGRAM_BOT_TOKEN или адреса Telegram не входят в разрешённые IP-адреса триггера. Функция status покажет последнюю ошибку.
Что дальше
- Вебхуки
- Внешние сервисы: все параметры
Telegram.send. - Память скрипта