Помощен център на KWIGA Услуги, интеграции, API, настройки Услуги Експортиране на данни в Google Sheets

Експортиране на данни в Google Sheets

Статии:

Ще ви покажем как да настроите автоматично експортиране на данни от Kwiga към Google Sheets.


Можете да настроите експортиране на данни за различни събития чрез автоматизация (като събитие можете да посочите добавен контакт, добавен таг, успешна или неуспешна покупка и др.; пълният списък със събития е наличен в статията).

Освен това можете да използвате опцията за изпращане на webhook при използване на уиджети; работният процес остава същият.

Основни стъпки:

  1. Създайте файл и добавете скрипта в него

  2. Създайте уеб приложение и получете връзката за изпращане на webhook

  3. Настройте изпращането на webhook чрез автоматизация в Kwiga или чрез изпращане на формуляр в уиджета.

Целият процес е показан във видеото и не изисква познания по програмиране. Просто следвайте предоставените стъпки и ако нещо не се получи, свържете се с поддръжката.

 

Стъпка 1: Създайте файл, към който ще се изпращат данни от Kwiga

Отворете Google Sheets и създайте нов файл, след което отворете редактора на скриптове.

Ще се отвори нов прозорец и трябва да поставите скрипта в неговия редактор. Можете да изтеглите скрипта чрез връзката (или да копирате текста в края на статията). Трябва да изтриете целия текст, който вече е в редактора.

Краен резултат:

Стъпка 2: Създайте уеб приложение и получете връзката за изпращане на webhook

В същия редактор на скриптове намерете бутона Deploy и изберете New deployment

Изберете Web app като тип, а в падащото меню Who has access задайте Everyone, след което щракнете върху Deploy.

В резултат ще получите Web App URL, който след това трябва да добавите в Kwiga.

 

Стъпка 3: Настройте изпращането на данни в Kwiga

Щракнете върху бутона All solutions в горното меню и изберете Automation. Създайте нов тригер и изберете събитието, което ще стартира автоматизацията. Това може да бъде добавен контакт, добавен таг, плащане или друго събитие.

След това превъртете надолу и изберете Webhook - Send data в действията. В полето за връзка посочете Web App URL, тип заявка POST и изберете полетата, които трябва да бъдат експортирани в таблицата.

Запазете и всички стъпки са завършени.

 

Като алтернатива можете да настроите изпращане на webhook от уиджета; това е налично при използване на елемента Form. Отметнете опцията Additionally send to a third-party service, след което в отворената форма добавете връзката, тип заявка POST и изберете параметрите за изпращане. В този списък ще са налични само параметрите, които присъстват във формата (този уиджет).

 

Как работи скриптът за Google Sheets за webhook-и

  • При първото извикване на webhook заглавията на таблицата се създават автоматично въз основа на ключовете на входящите данни
  • Ако таблицата вече има заглавия и трябва да започнете да получавате нови полета с данни, добавете тези заглавия в таблицата ръчно
  • Заглавията могат да бъдат пренареждани в таблицата - скриптът автоматично ще определи техните позиции
  • По подразбиране скриптът добавя нови записи при всяко получаване на webhook
  • Ако са посочени полета в keyColumns, скриптът ще актуализира съществуващите записи или ще добави нови, ако не бъде намерено съвпадение
  • ⚠️ Важно: След промяна на скрипта трябва да го внедрите отново в Google Apps Script и да актуализирате webhook връзката

Избор на лист:

  • По подразбиране се използва активният лист
  • Може да бъде променено чрез параметри на webhook:
  • "sheet_name": "Име на лист" - за избор на лист по име
  • "sheet_index": 2 - за избор на лист по номер (започвайки от 1)
// ============================================================
// НАСТРОЙКИ НА СКРИПТА
// ============================================================

// Проверка за дубликати - посочете полета за търсене на съществуващи записи
// Примери за употреба:
// var keyColumns = ["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;
}

// Обработване на входящ webhook
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);
    }
}