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

Внешние сервисы, Telegram и почта

Скрипт может обращаться к внешним API, отправлять сообщения в Telegram и письма на почту.

HTTP-запросы​

const response = Http.fetch("https://api.example.com/orders", {
method: "GET",
query: { since: "2026-10-01" },
headers: { Authorization: "Bearer " + Secrets.get("SHOP_TOKEN") },
timeout: 10000,
});

if (!response.ok) throw new Error("Сервис ответил с кодом " + response.status);
const orders = response.json();

Параметры Http.fetch(url, options):

ПараметрЧто задаёт
methodGET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS; без тела по умолчанию GET, с телом POST
headersзаголовки запроса
queryобъект, который добавится к адресу как параметры
bodyстрока или объект; объект отправляется как JSON
timeoutожидание ответа в миллисекундах, не больше 15 секунд
redirect"follow" (по умолчанию) или "manual" — не переходить по перенаправлению, а вернуть его

Короткие формы: Http.get(url, options) и Http.post(url, body, options).

Ответ:

Поле или методЧто возвращает
response.statusкод ответа
response.oktrue для кодов 200–299
response.json()ответ, разобранный из JSON
response.text()ответ текстом
response.header("Content-Type")заголовок ответа

Ограничения и защита:

  • до 50 внешних запросов за запуск (вместе с Telegram.send);
  • ответ до 2 МБ, ожидание до 15 секунд;
  • адреса внутренних сетей недоступны;
  • при перенаправлении на другой адрес передаются только стандартные заголовки, а ключи в ваших заголовках (например X-Api-Key) остаются у первого сервиса; переход с https на http не выполняется.

Ключи и токены храните в Секретах, а не в коде.

Пример: загрузить CSV​

Utilities.parseCsv возвращает все ячейки текстом, поэтому числа и даты нужно преобразовать перед записью.

function main() {
const text = Http.fetch("https://example.com/orders.csv").text();
const rows = Utilities.parseCsv(text).slice(1).map((row) => [row[0], Utilities.toDate(row[1]), Number(row[2])]);
Coverse.table.getSheet("Заказы").appendRows(rows);
}

Telegram​

Сообщения отправляет ваш бот:

  1. Создайте бота у @BotFather и получите токен.
  2. Сохраните токен в секрет TELEGRAM_BOT_TOKEN на вкладке «Секреты».
  3. Напишите боту из нужного чата хотя бы одно сообщение: бот не может первым написать человеку.
  4. Узнайте идентификатор чата (например, у бота @userinfobot) или используйте имя канала вида "@channel", если бот добавлен в канал.
Telegram.send(123456789, "Отчёт готов");
Telegram.send(123456789, "<b>Итог:</b> 12 заказов", { parseMode: "HTML" });
Telegram.send("@sales_channel", "Новый заказ", { silent: true, disablePreview: true });
Telegram.send(123456789, "Сообщение от другого бота", { secret: "SALES_BOT" });
ПараметрЧто делает
parseModeразметка: "HTML", "Markdown" или "MarkdownV2"
silent: trueбез звукового уведомления
disablePreview: trueбез предпросмотра ссылок
secretвзять токен из секрета с другим названием

Уведомления об изменениях таблицы можно получать в Telegram и без скрипта, через подписки API: Уведомления в Telegram на портале API.

Почта​

Mail.send("anna@example.com", "Отчёт за день", "Заказов сегодня: 12");

Mail.send(["anna@example.com", "ivan@example.com"], "Отчёт", "", {
htmlBody: "<p>Итог за день: <b>12 заказов</b></p>",
replyTo: "sales@example.com",
});

console.log("Ещё можно отправить:", Mail.remaining());
  • Письмо уходит от имени того, кто последним менял код скрипта, с пометкой «через Coverse». Ответ получателя придёт на его почту, если не задан replyTo.
  • В одном письме до 10 адресатов; адресаты видят адреса друг друга.
  • За сутки — не больше 10 адресатов на все скрипты владельца таблицы. Каждый адресат письма учитывается отдельно.
  • В htmlBody сохраняются абзацы, жирный шрифт, курсив, ссылки, списки и таблицы; картинки, стили и остальная разметка вырезаются.
  • Письма отправляются после завершения запуска, в том числе если запуск закончился ошибкой: уходят письма, поставленные до ошибки. Mail.send возвращает число адресатов.
  • Если на письмо не хватает суточного остатка, Mail.send выдаёт ошибку.

Почта в скриптах рассчитана на уведомления себе и коллегам, а не на рассылки клиентам.

Что дальше​