Отправка Discord-вебхуков из Google Таблиц (Apps Script)
Как отправлять уведомления в Discord из Google Таблиц через Apps Script. Триггеры на правки и отправку форм, embed-сообщения и обход лимитов — с готовым кодом.
🇬🇧 Доступно также на English
Зачем связывать Google Таблицы с Discord?
Google Таблицы — место, где многие команды собирают данные: ответы форм, регистрации, заказы, склад, баг-репорты. Apps Script позволяет отправлять эти данные в канал Discord в момент изменения строки или отправки формы — превращая таблицу в живую ленту уведомлений без сервера и платных инструментов.
В этом руководстве используется Google Apps Script и встроенный UrlFetchApp для отправки вебхуков Discord, с триггерами на правки и отправку форм, а также с embed-сообщениями.
Шаг 1: Получите URL вебхука Discord
В Discord: Настройки сервера → Интеграции → Вебхуки → Новый вебхук, выберите канал и нажмите Копировать URL вебхука. Новичок? Сначала прочитайте руководство по настройке.
Шаг 2: Откройте редактор Apps Script
В таблице перейдите в Расширения → Apps Script. Удалите код-заглушку и вставьте функцию ниже. Храните URL вебхука в Script Properties, чтобы он не был зашит в общий скрипт:
- В боковой панели редактора: Настройки проекта → Свойства скрипта → Добавить свойство.
- Назовите его
DISCORD_WEBHOOK_URLи вставьте свой URL как значение.
function getWebhookUrl() {
return PropertiesService.getScriptProperties().getProperty('DISCORD_WEBHOOK_URL');
}
function sendToDiscord(payload) {
const options = {
method: 'post',
contentType: 'application/json',
payload: JSON.stringify(payload),
muteHttpExceptions: true,
};
const response = UrlFetchApp.fetch(getWebhookUrl(), options);
const code = response.getResponseCode();
if (code >= 400) {
Logger.log('Ошибка Discord ' + code + ': ' + response.getContentText());
}
}
muteHttpExceptions: true позволяет прочитать тело ошибки Discord вместо выброса исключения — удобно при отладке 400 или 429.
Шаг 3: Отправьте тестовое сообщение
Добавьте быструю тест-функцию, выберите её в выпадающем списке тулбара и нажмите Запустить. Первый запуск попросит авторизовать скрипт — подтвердите.
function testWebhook() {
sendToDiscord({ content: 'Привет из Google Таблиц!' });
}
Сообщение в вашем канале Discord подтвердит, что связь работает.
Шаг 4: Уведомления на каждую правку
Чтобы отправлять сообщение в Discord при правке таблицы, используйте устанавливаемый триггер onEdit. (Простой onEdit не может надёжно вызывать внешние URL, поэтому для UrlFetchApp нужен устанавливаемый триггер.)
function onEditNotify(e) {
const sheet = e.range.getSheet();
const row = e.range.getRow();
const editedCell = e.range.getA1Notation();
const newValue = e.value || '(очищено)';
sendToDiscord({
embeds: [
{
title: 'Таблица обновлена',
color: 5793266,
fields: [
{ name: 'Лист', value: sheet.getName(), inline: true },
{ name: 'Ячейка', value: editedCell, inline: true },
{ name: 'Новое значение', value: String(newValue), inline: false },
],
footer: { text: 'Строка ' + row },
},
],
});
}
Зарегистрируйте триггер один раз:
- В редакторе: Триггеры (иконка часов) → Добавить триггер.
- Функция:
onEditNotify. Источник события: Из таблицы. Тип события: При изменении. - Сохраните (авторизуйте при запросе).
Теперь каждая правка отправляет цветной embed. Соберите макет визуально в конструкторе вебхуков и перенесите структуру полей в скрипт.
Шаг 5: Уведомления при отправке Google Формы
Если таблица связана с Google Формой, отправляйте каждый ответ автоматически. Используйте триггер При отправке формы, указывающий на эту функцию:
function onFormSubmitNotify(e) {
const values = e.values; // массив ответов в порядке столбцов
const headers = e.range.getSheet().getRange(1, 1, 1, values.length).getValues()[0];
const fields = headers.map((header, i) => ({
name: String(header || 'Поле ' + (i + 1)),
value: String(values[i] || '—'),
inline: false,
}));
sendToDiscord({
embeds: [
{
title: 'Новый ответ формы',
color: 5763719,
fields: fields.slice(0, 25), // Discord разрешает максимум 25 полей
},
],
});
}
Зарегистрируйте в Триггеры → Добавить триггер → Тип события: При отправке формы. Каждая отправка теперь приходит в Discord аккуратным embed с каждым ответом как полем. Ограничение slice(0, 25) уважает лимит полей Discord.
Шаг 6: Отправка сводок по расписанию
Триггер по времени может отправлять ежедневный или еженедельный дайджест — например, количество строк или сумму. Создайте функцию и назначьте в Триггеры → Добавить триггер → Управляемый временем:
function dailySummary() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheets()[0];
const rows = sheet.getLastRow() - 1; // минус заголовок
sendToDiscord({
embeds: [
{
title: 'Ежедневная сводка',
description: 'Всего записей: **' + rows + '**',
color: 16753920,
},
],
});
}
Как избежать лимитов
Вебхук Discord принимает около 30 запросов в минуту. Если массово импортировать сотни строк и слать запрос на каждую, вы упрётесь в 429. Чтобы не словить лимит:
- Группируйте много строк в одно сообщение вместо вебхука на строку.
- Добавляйте
Utilities.sleep(1200)между отправками в цикле, чтобы развести их по времени. - Для больших выгрузок отправляйте сводку («Добавлено 42 строки») вместо каждой строки.
Решение проблем
| Проблема | Причина и решение |
|---|---|
Authorization required | Запустите функцию вручную один раз и подтвердите OAuth-запрос. |
| Ничего не отправляется при правке | Вы использовали простой триггер — переключитесь на устанавливаемый onEdit. |
400 в логах | Некорректный embed (например, пустое значение поля или hex-цвет). См. гайд по ошибкам. |
429 при импорте | Слишком быстро отправляете — группируйте строки или добавьте Utilities.sleep. |
| Работает раз, потом перестаёт | Вебхук мог быть удалён/пересоздан — вставьте свежий URL в Script Properties. |
Что дальше
Ваша таблица теперь общается с Discord в реальном времени. Соберите и предпросмотрите макет embed в бесплатном конструкторе вебхуков и перенесите структуру JSON в Apps Script. Больше идей автоматизации — в гайде по уведомлениям и сценариям автоматизации.
Похожие статьи
- Настройка вебхука Discord — полное руководство за 2 минуты — Создайте URL вебхука
- Полное руководство по форматированию embed в Discord — Собирайте красивые embed
- Шпаргалка по лимитам embed Discord — Не выходите за лимиты полей и символов
- Ошибки вебхуков Discord: 400, 401, 403, 404, 429 — Почините упавшую отправку
Попробуйте в нашем инструменте
Открыть конструктор Discord Webhook