Centrum pomocy Kwiga Usługi, integracje, API, Ustawienia Usługi Eksport danych do Google Sheets

Eksport danych do Google Sheets

Artykuły:

Pokażemy Ci, jak skonfigurować automatyczny eksport danych z Kwiga do Google Sheets.


Możesz skonfigurować eksport danych dla różnych zdarzeń za pomocą automatyzacji (jako zdarzenie możesz określić dodanie kontaktu, dodanie tagu, udany lub nieudany zakup itp.; pełna lista zdarzeń jest dostępna w artykule).

Dodatkowo możesz skorzystać z opcji wysyłania webhooka podczas używania widżetów; proces pozostaje taki sam.

Główne kroki:

  1. Utwórz plik i dodaj do niego skrypt

  2. Utwórz aplikację internetową i uzyskaj link do wysyłania webhooka

  3. Skonfiguruj wysyłanie webhooka za pomocą automatyzacji w Kwiga lub przez wysłanie formularza w widżecie.

Cały proces jest pokazany na wideo i nie wymaga wiedzy programistycznej. Wystarczy wykonać podane kroki, a jeśli coś nie zadziała, skontaktuj się z pomocą techniczną.

 

Krok 1: Utwórz plik, do którego będą wysyłane dane z Kwiga

Otwórz Google Sheets i utwórz nowy plik, a następnie otwórz edytor skryptów.

Otworzy się nowe okno i musisz wkleić skrypt do jego edytora. Skrypt możesz pobrać pod tym linkiem (lub skopiować tekst na dole artykułu). Musisz usunąć cały tekst, który już znajduje się w edytorze.

Efekt końcowy:

Krok 2: Utwórz aplikację internetową i uzyskaj link do wysyłania webhooka

W tym samym edytorze skryptów znajdź przycisk Deploy i wybierz New deployment

Wybierz Web app jako typ, a na liście rozwijanej Who has access ustaw Everyone, a następnie kliknij Deploy.

W rezultacie otrzymasz Web App URL, który następnie musisz dodać w Kwiga.

 

Krok 3: Skonfiguruj wysyłanie danych w Kwiga

Kliknij przycisk All solutions w górnym menu i wybierz Automation. Utwórz nowy wyzwalacz i wybierz zdarzenie, które uruchomi automatyzację. Może to być dodanie kontaktu, dodanie tagu, płatność lub dowolne inne zdarzenie.

Następnie przewiń w dół i w działaniach wybierz Webhook - Send data. W polu linku podaj Web App URL, typ żądania POST i wybierz pola, które mają zostać wyeksportowane do tabeli.

Zapisz to, i wszystkie kroki będą zakończone.

 

Alternatywnie możesz skonfigurować wysyłanie webhooka z widżetu; jest to dostępne podczas korzystania z elementu Form. Zaznacz opcję Additionally send to a third-party service, a następnie w otwartym formularzu dodaj link, typ żądania POST i wybierz parametry do wysłania. Na tej liście będą dostępne tylko parametry obecne w formularzu (tym widżecie).

 

Jak działa skrypt Google Sheets dla webhooków

  • Przy pierwszym wywołaniu webhooka nagłówki tabeli są automatycznie tworzone na podstawie kluczy danych wejściowych
  • Jeśli tabela ma już nagłówki i chcesz zacząć otrzymywać nowe pola danych, dodaj te nagłówki ręcznie do tabeli
  • Nagłówki można zamieniać miejscami w tabeli - skrypt automatycznie określi ich pozycje
  • Domyślnie skrypt dodaje nowe wpisy przy każdym otrzymaniu webhooka
  • Jeśli określisz pola w keyColumns, skrypt będzie aktualizować istniejące wpisy lub dodawać nowe, jeśli nie znajdzie dopasowania
  • ⚠️ Ważne: Po zmianie skryptu należy wykonać nowe wdrożenie w Google Apps Script i zaktualizować link do webhooka

Wybór arkusza tabeli:

  • Domyślnie używany jest aktywny arkusz
  • Można to nadpisać przez parametry webhooka:
  • "sheet_name": "Nazwa arkusza" - aby wybrać arkusz po nazwie
  • "sheet_index": 2 - aby wybrać arkusz po numerze (zaczynając od 1)
// ============================================================
// USTAWIENIA SKRYPTU
// ============================================================

// Sprawdzanie duplikatów - określ pola do wyszukiwania istniejących rekordów
// Przykłady użycia:
// var keyColumns = ["email"];           - sprawdzanie po email
// var keyColumns = ["order_id"];        - sprawdzanie po ID zamówienia
// var keyColumns = ["email", "order_id"];  - sprawdzanie po kilku polach
var keyColumns = []; // Sprawdzanie duplikatów wyłączone

// ============================================================

// Funkcja do wysyłania odpowiedzi
function sendResponse(success, message) {
    var response = {
        "status": success ? "success" : "error",
        "message": message
    };
    return ContentService.createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

// Pobieranie strony docelowej do zapisu danych
function getTargetSheet(hook_data) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // Sprawdzamy, czy podano nazwę strony
    if (hook_data && hook_data.sheet_name) {
        try {
            var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
            if (sheet) {
                return sheet;
            }
        } catch (error) {
            // Strona nie znaleziona
        }
    }

    // Sprawdzamy, czy podano numer strony
    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; // Konwertujemy na indeks od 0
            if (index >= 0 && index < sheets.length) {
                return sheets[index];
            }
        } catch (error) {
            // Nieprawidłowy indeks strony
        }
    }

    // Domyślnie używamy aktywnej strony
    return SpreadsheetApp.getActiveSheet();
}

// Tworzy nagłówki w tabeli na podstawie przekazanych danych
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;
}

// Przetwarzanie przychodzącego webhooka
function doPost(e) {
    var hook_load = null;

    // Sprawdzamy obecność danych POST
    if (!e || !e.postData || !e.postData.contents) {
        return sendResponse(false, "Brak danych do przetworzenia");
    }

    // Parsujemy dane JSON
    try {
        hook_load = JSON.parse(e.postData.contents);
    } catch (error) {
        return sendResponse(false, "Błąd parsowania danych JSON");
    }

    // Walidacja otrzymanych danych
    if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
        return sendResponse(false, "Otrzymano nieprawidłowe lub puste dane");
    }

    try {
        // Pobieramy stronę docelową
        var sheet = getTargetSheet(hook_load);
        if (!sheet) {
            return sendResponse(false, "Nie udało się znaleźć podanej strony");
        }

        // Tworzenie nagłówków, jeśli tabela jest pusta
        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];
        }

        // Sprawdzanie duplikatów
        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; // uwzględnienie nagłówków
                    break;
                }
            }
        }

        // Przygotowanie danych do zapisu
        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];
            }
        }

        // Zapisywanie danych w tabeli
        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, "Dane zostały pomyślnie zapisane");

    } catch (error) {
        return sendResponse(false, "Błąd przy zapisywaniu danych: " + error.message);
    }
}