Статьи:
- Экспорт данных в Google Sheets
- Подключение FB-pixel к проекту на Kwiga
- Отправка вебхука (webhook) для передачи данных в другой сервис
- Основы интеграции и использования Zoom
- Формирование ссылок на оплату с предустановленными данными
- Обработка клика на кнопку в виджете
- Передача вебхука в KeyCRM с разделением заявки и оплаты
Покажем, как настроить автоматический экспорт данных из Kwiga в Google Sheets (Таблицу Google).
Вы можете настроить экспорт данных для различных событий, используя автоматизацию (в качестве события можно указать добавление контакта, добавление тега, успешную или неуспешную покупку и т.д, полный список событий можно посмотреть в статье).
Дополнительно Вы можете использовать возможность отправки вебхука при использовании виджет, принцип действий остается таким же.
Основные шаги:
-
Создать файл и добавить в него скрипт
-
Создать webapp и получить ссылку для отправки вебхука
-
Настроить отправку вебхука используя автоматизацию на Kwiga или же отправку форму в виджете.
Весь процесс показан на видео и не требует знаний в программировании. Просто следуйте указанным шагам, а если что-то не получается - свяжитесь с поддержкой.
Шаг 1: Создать файл, куда будут передаваться данные из Kwiga
Откройте Google Sheets и создайте новый файл и откройте редактор скриптов.
Откроется новое окно, в редактор которого Вам необходимо вставить скрипт. Скачать скрипт Вы можете по ссылке (или же скопируйте текст внизу статьи). Весь текст, который уже есть в редакторе Вам необходимо удалить.
Итоговый вид:
Шаг 2: Создать webapp и получить ссылку для отправки вебхука
В том же редакторе скрипта найдите кнопку Deploy и выберите New deployment
Укажите Web app в типе, а в дропдауне У кого есть доступ установите Все, и нажмите Deploy.
В результате Вы получите Web App URL, которую и нужно будет добавить на Kwiga.
Шаг 3: Настройка отправки данных на Kwiga
Нажмите на кнопку Все решения в верхнем меню и выберите Автоматизация. Создайте новый триггер и выберите событие, при котором будет запускаться автоматизация. Это может быть добавление контакта, добавление тега, оплата или же любое другое событие.
После этого опуститесь ниже и выберите в действиях Вебхук - Отправка данных. В ссылке укажите Web App URL, тип запроса POST, и выберите поля, которые должны быть экспортированы в таблицу.
Сохраните и все шаги выполнены.
Альтернативно, Вы можете настроить отправку вебхука из виджета, это доступно при использовании элемента Форма. Установите отметку Дополнительно передавать в сторонний сервис, в открывшейся форме добавьте ссылку, тип запроса POST, и выберите параметры для передачи. В этом списке будут доступны только те параметры, которые есть в форме (этом виджете).
Как работает скрипт Google Sheets для вебхуков
- При первом обращении вебхука автоматически создаются заголовки таблицы на основе ключей входящих данных
- Если в таблице уже есть заголовки и нужно начать получать новые поля данных, добавьте эти заголовки в таблицу вручную
- Заголовки можно менять местами в таблице - скрипт автоматически определит их позиции
- По умолчанию скрипт добавляет новые записи при каждом получении вебхука
- Если указать поля в keyColumns, скрипт будет обновлять существующие записи или добавлять новые, если не найдет совпадения
- ⚠️ Важно: После изменения скрипта необходимо сделать новое развертывание в Google Apps Script и обновить ссылку на вебхук
Выбор листа таблицы:
- По умолчанию используется активный лист
- Можно переопределить через параметры вебхука:
- "sheet_name": "Название листа" - для выбора листа по имени
- "sheet_index": 2 - для выбора листа по номеру (начиная с 1)
// ============================================================
// НАСТРОЙКИ СКРИПТА
// ============================================================
// Проверка дубликатов - укажите поля для поиска существующих записей
// Примеры использования:
// var keyColumns = ["email"]; - проверка по email
// var keyColumns = ["order_id"]; - проверка по ID заказа
// var keyColumns = ["email", "order_id"]; - проверка по нескольким полям
var keyColumns = []; // Проверка дубликатов отключена
// ============================================================
// Функция для отправки ответа
function sendResponse(success, message) {
var response = {
"status": success ? "success" : "error",
"message": message
};
return ContentService.createTextOutput(JSON.stringify(response))
.setMimeType(ContentService.MimeType.JSON);
}
// Получение целевой страницы для записи данных
function getTargetSheet(hook_data) {
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
// Проверяем, указано ли имя страницы
if (hook_data && hook_data.sheet_name) {
try {
var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
if (sheet) {
return sheet;
}
} catch (error) {
// Страница не найдена
}
}
// Проверяем, указан ли номер страницы
if (hook_data && hook_data.sheet_index && !isNaN(hook_data.sheet_index)) {
try {
var sheets = spreadsheet.getSheets();
var index = parseInt(hook_data.sheet_index) - 1; // Конвертируем в индекс от 0
if (index >= 0 && index < sheets.length) {
return sheets[index];
}
} catch (error) {
// Неверный индекс страницы
}
}
// По умолчанию используем активную страницу
return SpreadsheetApp.getActiveSheet();
}
// Создаёт заголовки в таблице на основе переданных данных
function populateHeaders(hook_data, sheet) {
if (!hook_data || typeof hook_data !== 'object') {
return false;
}
if (!sheet) {
sheet = getTargetSheet(hook_data);
}
var last_row = Math.max(sheet.getLastRow(), 1);
sheet.insertRowAfter(last_row);
var headers_row = ['timestamp'];
var hook_data_keys = Object.keys(hook_data);
for (var i = 0; i < hook_data_keys.length; i++) {
headers_row.push(hook_data_keys[i]);
}
sheet.appendRow(headers_row);
SpreadsheetApp.flush();
return true;
}
// Обработка входящего вебхука
function doPost(e) {
var hook_load = null;
// Проверяем наличие POST данных
if (!e || !e.postData || !e.postData.contents) {
return sendResponse(false, "Нет данных для обработки");
}
// Парсим JSON данные
try {
hook_load = JSON.parse(e.postData.contents);
} catch (error) {
return sendResponse(false, "Ошибка парсинга JSON данных");
}
// Валидация полученных данных
if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
return sendResponse(false, "Получены некорректные или пустые данные");
}
try {
// Получаем целевую страницу
var sheet = getTargetSheet(hook_load);
if (!sheet) {
return sendResponse(false, "Не удалось найти указанную страницу");
}
// Создание заголовков, если таблица пустая
if (sheet.getLastColumn() === 0) {
populateHeaders(hook_load, sheet);
}
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
if (headers.length === 0 || headers[0] === "") {
populateHeaders(hook_load, sheet);
headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
}
// Проверка дубликатов
var data = [];
var targetRow = -1;
var numRows = sheet.getLastRow() - 1;
if (keyColumns.length > 0 && numRows > 0) {
data = sheet.getRange(2, 1, numRows, sheet.getLastColumn()).getValues();
for (var r = 0; r < data.length; r++) {
var row = data[r];
var match = true;
for (var k = 0; k < keyColumns.length; k++) {
var key = keyColumns[k];
var idx = headers.indexOf(key);
if (idx === -1 || row[idx] != hook_load[key]) {
match = false;
break;
}
}
if (match) {
targetRow = r + 2; // учёт заголовков
break;
}
}
}
// Подготовка данных для записи
var new_sheet_row = new Array(headers.length).fill('');
for (var h = 0; h < headers.length; h++) {
var key = headers[h];
if (key === 'timestamp') {
new_sheet_row[h] = new Date();
} else if (hook_load.hasOwnProperty(key)) {
new_sheet_row[h] = hook_load[key];
}
}
// Сохранение данных в таблицу
if (targetRow > -1) {
sheet.getRange(targetRow, 1, 1, new_sheet_row.length).setValues([new_sheet_row]);
} else {
sheet.appendRow(new_sheet_row);
}
SpreadsheetApp.flush();
return sendResponse(true, "Данные успешно сохранены");
} catch (error) {
return sendResponse(false, "Ошибка при сохранении данных: " + error.message);
}
}