KWIGA centar za pomoć Usluge, integracije, API, Podešavanja Usluge Izvoz podataka u Google Sheets

Izvoz podataka u Google Sheets

Članci:

Pokazaćemo vam kako da podesite automatski izvoz podataka iz Kwiga u Google Sheets.


Možete podesiti izvoz podataka za različite događaje pomoću automatizacije (kao događaj možete navesti dodat kontakt, dodatu oznaku, uspešnu ili neuspešnu kupovinu itd.; kompletna lista događaja dostupna je u članku).

Pored toga, možete koristiti opciju slanja webhooka pri korišćenju vidžeta; tok rada ostaje isti.

Glavni koraci:

  1. Kreirajte datoteku i dodajte skriptu u nju

  2. Kreirajte veb-aplikaciju i preuzmite link za slanje webhooka

  3. Podesite slanje webhooka pomoću automatizacije u Kwiga ili slanjem obrasca u vidžetu.

Ceo proces je prikazan u videu i ne zahteva poznavanje programiranja. Samo pratite navedene korake, a ako nešto ne uspe, kontaktirajte podršku.

 

Korak 1: Kreirajte datoteku u koju će se slati podaci iz Kwiga

Otvorite Google Sheets i kreirajte novu datoteku, a zatim otvorite uređivač skripti.

Otvoriće se novi prozor i potrebno je da nalepite skriptu u njegov uređivač. Skriptu možete preuzeti putem linka (ili kopirati tekst na dnu članka). Potrebno je da obrišete sav tekst koji se već nalazi u uređivaču.

Konačni rezultat:

Korak 2: Kreirajte veb-aplikaciju i preuzmite link za slanje webhooka

U istom uređivaču skripti pronađite dugme Deploy i izaberite New deployment

Izaberite Web app kao tip, a u padajućem meniju Who has access postavite Everyone, zatim kliknite na Deploy.

Kao rezultat, dobićete Web App URL, koji zatim treba da dodate u Kwiga.

 

Korak 3: Podesite slanje podataka u Kwiga

Kliknite na dugme All solutions u gornjem meniju i izaberite Automation. Kreirajte novi okidač i odaberite događaj koji će pokrenuti automatizaciju. To može biti dodat kontakt, dodata oznaka, plaćanje ili bilo koji drugi događaj.

Nakon toga, pomerite se nadole i u radnjama izaberite Webhook - Send data. U polju za link navedite Web App URL, tip zahteva POST i odaberite polja koja treba izvesti u tabelu.

Sačuvajte i svi koraci su završeni.

 

Alternativno, možete podesiti slanje webhooka iz vidžeta; ovo je dostupno kada koristite element Form. Označite opciju Additionally send to a third-party service, a zatim u obrascu koji se otvori dodajte link, tip zahteva POST i odaberite parametre za slanje. Na ovoj listi biće dostupni samo parametri koji su prisutni u obrascu (ovom vidžetu).

 

Kako funkcioniše Google Sheets skripta za webhookove

  • Pri prvom webhook pozivu, zaglavlja tabele se automatski kreiraju na osnovu ključeva dolaznih podataka
  • Ako tabela već ima zaglavlja i treba da počnete da primate nova polja podataka, ručno dodajte ta zaglavlja u tabelu
  • Zaglavlja se mogu preurediti u tabeli - skripta će automatski odrediti njihove pozicije
  • Podrazumevano, skripta dodaje nove unose svaki put kada primi webhook
  • Ako su polja navedena u keyColumns, skripta će ažurirati postojeće unose ili dodati nove ako nije pronađeno podudaranje
  • ⚠️ Važno: Nakon izmene skripte, potrebno je da je ponovo postavite u Google Apps Script i ažurirate webhook link

Izbor lista:

  • Podrazumevano se koristi aktivni list
  • Može se zameniti putem parametara webhooka:
  • "sheet_name": "Sheet Name" - za izbor lista po nazivu
  • "sheet_index": 2 - za izbor lista po broju (počevši od 1)
// ============================================================
// PODEŠAVANJA SKRIPTE
// ============================================================

// Provera duplikata - navedite polja za pretragu postojećih zapisa
// Primeri upotrebe:
// var keyColumns = ["email"];           - provera po email adresi
// var keyColumns = ["order_id"];        - provera po ID-u porudžbine
// var keyColumns = ["email", "order_id"];  - provera po više polja
var keyColumns = []; // Provera duplikata je onemogućena

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

// Funkcija za slanje odgovora
function sendResponse(success, message) {
    var response = {
        "status": success ? "success" : "error",
        "message": message
    };
    return ContentService.createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

// Dobijanje ciljne stranice za unos podataka
function getTargetSheet(hook_data) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // Provera da li je naveden naziv stranice
    if (hook_data && hook_data.sheet_name) {
        try {
            var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
            if (sheet) {
                return sheet;
            }
        } catch (error) {
            // Stranica nije pronađena
        }
    }

    // Provera da li je naveden broj stranice
    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; // Pretvaranje u indeks od 0
            if (index >= 0 && index < sheets.length) {
                return sheets[index];
            }
        } catch (error) {
            // Nevažeći indeks stranice
        }
    }

    // Podrazumevano se koristi aktivna stranica
    return SpreadsheetApp.getActiveSheet();
}

// Kreira zaglavlja u tabeli na osnovu dostavljenih podataka
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;
}

// Obrada dolaznog webhooka
function doPost(e) {
    var hook_load = null;

    // Provera POST podataka
    if (!e || !e.postData || !e.postData.contents) {
        return sendResponse(false, "Nema podataka za obradu");
    }

    // Parsiranje JSON podataka
    try {
        hook_load = JSON.parse(e.postData.contents);
    } catch (error) {
        return sendResponse(false, "Greška pri parsiranju JSON podataka");
    }

    // Validacija primljenih podataka
    if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
        return sendResponse(false, "Primljeni su neispravni ili prazni podaci");
    }

    try {
        // Dobijanje ciljne stranice
        var sheet = getTargetSheet(hook_load);
        if (!sheet) {
            return sendResponse(false, "Nije moguće pronaći navedenu stranicu");
        }

        // Kreiranje zaglavlja ako je tabela prazna
        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];
        }

        // Provera duplikata
        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; // obrada zaglavlja
                    break;
                }
            }
        }

        // Priprema podataka za unos
        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];
            }
        }

        // Čuvanje podataka u 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, "Podaci su uspešno sačuvani");

    } catch (error) {
        return sendResponse(false, "Greška pri čuvanju podataka: " + error.message);
    }
}