Κέντρο βοήθειας KWIGA Υπηρεσίες, ενσωματώσεις, API, Ρυθμίσεις Υπηρεσίες Data export to Google Sheets

Data export to Google Sheets

Άρθρα:

We will show you how to set up automatic data export from Kwiga to Google Sheets.


Μπορείτε να ρυθμίσετε την εξαγωγή δεδομένων για διάφορα συμβάντα χρησιμοποιώντας την αυτοματοποίηση (μπορείτε να ορίσετε ως συμβάν την προσθήκη επαφής, την προσθήκη ετικέτας, την επιτυχημένη ή αποτυχημένη αγορά κ.λπ.· η πλήρης λίστα συμβάντων είναι διαθέσιμη στο άρθρο).

Επιπλέον, μπορείτε να χρησιμοποιήσετε την επιλογή αποστολής webhook κατά τη χρήση widgets· η ροή εργασίας παραμένει η ίδια.

Κύρια βήματα:

  1. Δημιουργήστε ένα αρχείο και προσθέστε το script σε αυτό

  2. Δημιουργήστε μια web app και λάβετε τον σύνδεσμο για την αποστολή του webhook

  3. Ρυθμίστε την αποστολή webhook χρησιμοποιώντας την αυτοματοποίηση στο Kwiga ή την υποβολή φόρμας στο widget.

Η όλη διαδικασία παρουσιάζεται στο βίντεο και δεν απαιτεί γνώσεις προγραμματισμού. Απλώς ακολουθήστε τα παρεχόμενα βήματα και, αν κάτι δεν λειτουργεί, επικοινωνήστε με την υποστήριξη.

 

Βήμα 1: Δημιουργήστε ένα αρχείο όπου θα αποστέλλονται τα δεδομένα από το Kwiga

Ανοίξτε το Google Sheets και δημιουργήστε ένα νέο αρχείο, έπειτα ανοίξτε τον επεξεργαστή script.

Θα ανοίξει ένα νέο παράθυρο και θα πρέπει να επικολλήσετε το script στον επεξεργαστή του. Μπορείτε να κατεβάσετε το script μέσω του συνδέσμου (ή να αντιγράψετε το κείμενο στο κάτω μέρος του άρθρου). Πρέπει να διαγράψετε όλο το κείμενο που υπάρχει ήδη στον επεξεργαστή.

Τελικό αποτέλεσμα:

Βήμα 2: Δημιουργήστε μια web app και λάβετε τον σύνδεσμο για την αποστολή του webhook

Στον ίδιο επεξεργαστή script, βρείτε το κουμπί Deploy και επιλέξτε New deployment

Επιλέξτε Web app ως τύπο και στο αναπτυσσόμενο πεδίο Who has access ορίστε το σε Everyone και μετά κάντε κλικ στο Deploy.

Ως αποτέλεσμα, θα λάβετε το Web App URL, το οποίο στη συνέχεια πρέπει να προσθέσετε στο Kwiga.

 

Βήμα 3: Ρυθμίστε την αποστολή δεδομένων στο Kwiga

Κάντε κλικ στο κουμπί All solutions στο επάνω μενού και επιλέξτε Automation. Δημιουργήστε ένα νέο trigger και επιλέξτε το συμβάν που θα εκκινεί την αυτοματοποίηση. Αυτό μπορεί να είναι προσθήκη επαφής, προσθήκη ετικέτας, πληρωμή ή οποιοδήποτε άλλο συμβάν.

Έπειτα, κάντε κύλιση προς τα κάτω και επιλέξτε Webhook - Send data στις ενέργειες. Στο πεδίο συνδέσμου, καθορίστε το Web App URL, τύπο αιτήματος POST και επιλέξτε τα πεδία που πρέπει να εξαχθούν στον πίνακα.

Αποθηκεύστε το και όλα τα βήματα θα έχουν ολοκληρωθεί.

 

Εναλλακτικά, μπορείτε να ρυθμίσετε την αποστολή webhook από το widget· αυτό είναι διαθέσιμο όταν χρησιμοποιείτε το στοιχείο Form. Επιλέξτε την επιλογή Additionally send to a third-party service και, στη φόρμα που ανοίγει, προσθέστε τον σύνδεσμο, τον τύπο αιτήματος POST και επιλέξτε τις παραμέτρους προς αποστολή. Μόνο οι παράμετροι που υπάρχουν στη φόρμα (σε αυτό το widget) θα είναι διαθέσιμες σε αυτή τη λίστα.

 

Πώς λειτουργεί το script του Google Sheets για webhooks

  • Κατά την πρώτη κλήση του webhook, οι κεφαλίδες του πίνακα δημιουργούνται αυτόματα με βάση τα κλειδιά των εισερχόμενων δεδομένων
  • Αν ο πίνακας έχει ήδη κεφαλίδες και χρειάζεται να αρχίσετε να λαμβάνετε νέα πεδία δεδομένων, προσθέστε αυτές τις κεφαλίδες στον πίνακα χειροκίνητα
  • Οι κεφαλίδες μπορούν να αλλάξουν θέση στον πίνακα - το script θα καθορίσει αυτόματα τις θέσεις τους
  • Από προεπιλογή, το script προσθέτει νέες εγγραφές κάθε φορά που λαμβάνει το webhook
  • Αν καθορίσετε πεδία στο keyColumns, το script θα ενημερώνει τις υπάρχουσες εγγραφές ή θα προσθέτει νέες αν δεν βρει αντιστοιχία
  • ⚠️ Σημαντικό: Μετά την αλλαγή του script, πρέπει να κάνετε νέα ανάπτυξη στο Google Apps Script και να ενημερώσετε τον σύνδεσμο του webhook

Επιλογή φύλλου πίνακα:

  • Από προεπιλογή χρησιμοποιείται το ενεργό φύλλο
  • Μπορεί να επανακαθοριστεί μέσω των παραμέτρων του webhook:
  • "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;
}

// Επεξεργασία εισερχόμενου 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);
    }
}