Перейти к содержимому
Все статьи

Отправка Discord-вебхуков из Google Таблиц (Apps Script)

Как отправлять уведомления в Discord из Google Таблиц через Apps Script. Триггеры на правки и отправку форм, embed-сообщения и обход лимитов — с готовым кодом.

google sheets discord вебхукapps script discordgoogle forms discordтаблицы в discord 2026urlfetchapp discordавтоматизация webhook

🇬🇧 Доступно также на English

Отправка Discord-вебхуков из Google Таблиц (Apps Script)

Зачем связывать 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, чтобы он не был зашит в общий скрипт:

  1. В боковой панели редактора: Настройки проекта → Свойства скрипта → Добавить свойство.
  2. Назовите его 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 },
      },
    ],
  });
}

Зарегистрируйте триггер один раз:

  1. В редакторе: Триггеры (иконка часов) → Добавить триггер.
  2. Функция: onEditNotify. Источник события: Из таблицы. Тип события: При изменении.
  3. Сохраните (авторизуйте при запросе).

Теперь каждая правка отправляет цветной 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 Webhook