Запись сообщений WhatsApp в Google Sheets и отправка из таблицы
Укажите адрес вебхука номера на рабочий процесс n8n, в котором узел Google Sheets добавляет строку на каждое сообщение: отправитель, имя, текст, идентификатор сообщения и время. Чтобы отправлять из таблицы, функция Apps Script может обойти строки и вызвать Cloud API через UrlFetchApp, используя идентификатор номера (phone number id) и токен. Команда по-прежнему отвечает клиентам из приложения WhatsApp Business.
Допустимое число запросов на запись в Google Sheets API в минуту на пользователя в проекте; 300 на проект.
Вызовы URL Fetch в Apps Script для личного аккаунта Google; аккаунты Workspace получают 100 000.
Максимальная длительность одного выполнения Apps Script, после которой оно принудительно останавливается.
Как каждое сообщение WhatsApp превращается в строку?
Meta отправляет каждое сообщение номера на заданный вами адрес вебхука. Здесь это узел Webhook в n8n, который заодно отвечает на проверочный запрос Meta. Следующий узел: Google Sheets с операцией Append Row. Он переносит поля из тела запроса в столбцы: номер отправителя, имя профиля, текст, идентификатор сообщения WhatsApp, время и идентификатор номера, принявшего сообщение (phone number id).
Чтобы повторные доставки не вредили, используйте Append or Update Row с ключом по идентификатору сообщения вместо простого добавления. Meta присылает сообщение повторно, если считает, что доставка не удалась, и при ключе по идентификатору вторая доставка просто обновит ту же строку.
На номере Coexistence ответы, набранные в приложении WhatsApp Business, приходят на тот же вебхук как события smb_message_echoes. Если записывать их со столбцом направления, в таблице окажутся обе стороны переписки.
Где срабатывает квота Sheets?
На записи в расчёте на пользователя. Sheets API допускает 300 запросов на запись в минуту на проект и 60 в минуту на пользователя в проекте, а учётные данные n8n соответствуют одному пользователю. Поэтому рабочий процесс, который добавляет по строке на сообщение, выдерживает примерно одно сообщение в секунду на постоянной основе.
Для большинства номеров магазинов этого с запасом хватает. Но запаса не остаётся после рассылки шаблона, когда несколько сотен клиентов отвечают за несколько минут. Тогда API отвечает 429 Too Many Requests, и без повторных попыток строки теряются.
Есть два решения, достаточно любого. Включите повторные попытки с ожиданием в узле Google Sheets: это совпадает с рекомендацией самого Google делать экспоненциальную паузу. Либо собирайте пакеты: пусть n8n накапливает сообщения тридцать секунд и добавляет их одним запросом, так много записей превращается в одну.
Как отправлять шаблоны из таблицы?
Через Apps Script, из меню «Расширения» таблицы. Функция читает строки, которые ещё не отправлены, для каждой вызывает эндпоинт сообщений Cloud API через UrlFetchApp и записывает в строку полученный идентификатор сообщения и время. Запускать её можно по таймеру раз в несколько минут или вручную из собственного меню.
Храните токен доступа в свойствах скрипта, а не в коде: тогда те, кто может просматривать скрипт, его не увидят.
Учитывайте квоты. Личный аккаунт Google получает 20 000 вызовов URL Fetch в сутки, аккаунт Workspace 100 000, а каждое выполнение останавливается через шесть минут. Обрабатывайте строки порциями и помечайте каждую как отправленную до перехода к следующей, чтобы прерванный запуск продолжился с нужного места, а не отправил сообщения дважды.
function sendPending() {
const token = PropertiesService.getScriptProperties().getProperty("WHATSAPP_TOKEN");
const sheet = SpreadsheetApp.getActive().getSheetByName("Send");
const rows = sheet.getDataRange().getValues();
for (let i = 1; i < rows.length; i++) {
const [phone, name, sentAt] = rows[i];
if (sentAt) continue;
const res = UrlFetchApp.fetch("https://graph.facebook.com/v23.0/<PHONE_NUMBER_ID>/messages", {
method: "post",
contentType: "application/json",
headers: { Authorization: "Bearer " + token },
payload: JSON.stringify({
messaging_product: "whatsapp", to: String(phone), type: "template",
template: { name: "order_ready", language: { code: "en" },
components: [{ type: "body", parameters: [{ type: "text", text: name }] }] },
}),
});
sheet.getRange(i + 1, 3).setValue(new Date());
}
}Распространённые ошибки
- Добавлять строки без ключа по идентификатору сообщения. Тогда повторные доставки Meta запишут одно и то же сообщение в две строки.
- Писать по строке на сообщение через одни учётные данные во время всплеска ответов. Лимит в 60 записей в минуту на пользователя вернёт 429, и строки будут потеряны.
- Отправлять свободный текст из таблицы людям, которые не писали вам 24 часа. Вне этого окна доставляется только одобренный шаблон.
Подключите номер на easycoexistence.com, укажите адрес его вебхука на рабочий процесс n8n и скопируйте идентификатор номера (phone number id) и токен в скрипт. От US$ 9 за номер в месяц, до US$ 1 по мере добавления номеров, первые 3 дня бесплатно.
Часто задаваемые вопросы
Можно ли использовать Make или Zapier вместо n8n?
Да. Собственный вебхук Make или catch hook в Zapier принимает сообщение, а их шаг Google Sheets добавляет строку.
От имени какого аккаунта Google пишет n8n?
От имени того, который авторизовал учётные данные Google в n8n. У этого аккаунта должен быть доступ на редактирование таблицы, и расходуется именно его квота записи на пользователя.
Правильно ли отформатирован столбец с номерами?
Храните номера как обычный текст: цифры с кодом страны и без знака плюс, в том виде, в каком их присылает Meta. Иначе Sheets воспримет их как числа, отбросит ведущий плюс и может изменить формат длинных значений.
Хранит ли EasyCoexistence копию сообщений?
Нет. Meta доставляет каждый вебхук на ваш URL в n8n, и таблица остаётся единственной копией.
Читайте дальше
Готовы начать?
Настройте WhatsApp Coexistence за несколько минут, а не месяцев. Приложение продолжит работать на телефоне.
Начать бесплатный пробный периодПроверено по состоянию на