Статті:
- Експорт даних у 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); } }