Перейти к основному содержимому

Бот Telegram записывает в таблицу

Пользователь пишет боту в Telegram, сообщение появляется строкой в таблице, бот отвечает «Записали». Так можно собирать заявки, показания, отчёты сотрудников или заказы без своего сервера: бот работает через вебхук скрипта.

Что понадобится:

  • таблица Coverse на тарифе «Бизнес» или выше;
  • бот Telegram и его токен;
  • 10 минут.

Если нужно наоборот, присылать в Telegram уведомления из таблицы, смотрите Внешние сервисы.

1. Создайте бота​

  1. В Telegram откройте @BotFather и отправьте команду /newbot.
  2. Задайте имя и адрес бота, BotFather пришлёт токен вида 123456789:AA….
  3. В редакторе скрипта на вкладке «Секреты» добавьте секрет 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. Создайте адрес вебхука и подключите бота​

  1. На вкладке «Триггеры» добавьте «По вебхуку» с функцией onWebhook.
  2. Скопируйте адрес вида https://app.coverse.team/api/hooks/scripts/whs_… и вставьте его в HOOK_URL в коде. Telegram не умеет передавать заголовок X-Coverse-Token, поэтому нужен именно адрес с секретом.
  3. В поле «Разрешённые IP-адреса» триггера укажите адреса, с которых Telegram отправляет запросы: 149.154.160.0/20, 91.108.4.0/22. Telegram предупреждает, что список может меняться: актуальный — в документации Telegram.
  4. Сохраните скрипт, выберите функцию 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 покажет последнюю ошибку.

Что дальше​