Centro de ayuda de Kwiga Servicios, integraciones, API, Configuración Servicios Exportación de datos a Google Sheets

Exportación de datos a Google Sheets

Artículos:

Te mostraremos cómo configurar la exportación automática de datos desde Kwiga a Google Sheets.


Puedes configurar la exportación de datos para varios eventos usando la automatización (puedes especificar como evento contacto añadido, etiqueta añadida, compra exitosa o fallida, etc.; la lista completa de eventos está disponible en el artículo).

Además, puedes usar la opción de enviar un webhook al usar widgets; el flujo sigue siendo el mismo.

Pasos principales:

  1. Crea un archivo y añade el script en él

  2. Crea una aplicación web y obtén el enlace para enviar el webhook

  3. Configura el envío de webhooks usando la automatización en Kwiga o el envío del formulario en el widget.

Todo el proceso se muestra en el video y no requiere conocimientos de programación. Solo sigue los pasos indicados y, si algo no funciona, contacta con soporte.

 

Paso 1: Crea un archivo al que se enviarán los datos desde Kwiga

Abre Google Sheets y crea un archivo nuevo; luego abre el editor de scripts.

Se abrirá una nueva ventana y tendrás que pegar el script en su editor. Puedes descargar el script a través del enlace (o copiar el texto al final del artículo). Debes eliminar todo el texto que ya está en el editor.

Resultado final:

Paso 2: Crea una aplicación web y obtén el enlace para enviar el webhook

En el mismo editor de scripts, busca el botón Deploy y selecciona New deployment

Selecciona Web app como tipo y, en la lista desplegable Who has access, configúralo como Everyone; luego haz clic en Deploy.

Como resultado, obtendrás la Web App URL, que luego deberás añadir en Kwiga.

 

Paso 3: Configura el envío de datos en Kwiga

Haz clic en el botón All solutions en el menú superior y selecciona Automation. Crea un nuevo disparador y elige el evento que iniciará la automatización. Puede ser contacto añadido, etiqueta añadida, pago o cualquier otro evento.

Después de eso, desplázate hacia abajo y selecciona Webhook - Send data en las acciones. En el campo de enlace, especifica la Web App URL, el tipo de solicitud POST y selecciona los campos que deben exportarse a la tabla.

Guárdalo y todos los pasos estarán completos.

 

Como alternativa, puedes configurar el envío de webhooks desde el widget; esto está disponible al usar el elemento Form. Marca la opción Additionally send to a third-party service y luego, en el formulario que se abre, añade el enlace, el tipo de solicitud POST y selecciona los parámetros que se enviarán. En esta lista solo estarán disponibles los parámetros que estén presentes en el formulario (este widget).

 

Cómo funciona el script de Google Sheets para webhooks

  • Al primer acceso del webhook, se crean automáticamente los encabezados de la tabla basados en las claves de los datos entrantes
  • Si la tabla ya tiene encabezados y necesitas empezar a recibir nuevos campos de datos, añade estos encabezados a la tabla manualmente
  • Los encabezados se pueden reordenar en la tabla - el script detectará automáticamente sus posiciones
  • Por defecto, el script añade nuevos registros cada vez que recibe un webhook
  • Si especificas campos en keyColumns, el script actualizará los registros existentes o añadirá nuevos si no encuentra coincidencias
  • ⚠️ Importante: Después de modificar el script, es necesario hacer un nuevo despliegue en Google Apps Script y actualizar el enlace al webhook

Selección de hoja de la tabla:

  • Por defecto se utiliza la hoja activa
  • Se puede redefinir a través de los parámetros del webhook:
  • "sheet_name": "Nombre de la hoja" - para seleccionar la hoja por nombre
  • "sheet_index": 2 - para seleccionar la hoja por número (empezando desde 1)
// ============================================================
// CONFIGURACIÓN DEL SCRIPT
// ============================================================

// Verificación de duplicados - especifique los campos para buscar registros existentes
// Ejemplos de uso:
// var keyColumns = ["email"];           - verificación por email
// var keyColumns = ["order_id"];        - verificación por ID de pedido
// var keyColumns = ["email", "order_id"];  - verificación por varios campos
var keyColumns = []; // Verificación de duplicados desactivada

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

// Función para enviar respuesta
function sendResponse(success, message) {
    var response = {
        "status": success ? "success" : "error",
        "message": message
    };
    return ContentService.createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

// Obteniendo la página de destino para registrar datos
function getTargetSheet(hook_data) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // Verificando si se especificó el nombre de la página
    if (hook_data && hook_data.sheet_name) {
        try {
            var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
            if (sheet) {
                return sheet;
            }
        } catch (error) {
            // Página no encontrada
        }
    }

    // Verificando si se especificó el número de página
    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; // Convirtiendo a índice desde 0
            if (index >= 0 && index < sheets.length) {
                return sheets[index];
            }
        } catch (error) {
            // Índice de página incorrecto
        }
    }

    // Por defecto, usar la página activa
    return SpreadsheetApp.getActiveSheet();
}

// Crea encabezados en la tabla basados en los datos proporcionados
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;
}

// Procesamiento del webhook entrante
function doPost(e) {
    var hook_load = null;

    // Verificando la presencia de datos POST
    if (!e || !e.postData || !e.postData.contents) {
        return sendResponse(false, "No hay datos para procesar");
    }

    // Analizando datos JSON
    try {
        hook_load = JSON.parse(e.postData.contents);
    } catch (error) {
        return sendResponse(false, "Error al analizar datos JSON");
    }

    // Validación de los datos recibidos
    if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
        return sendResponse(false, "Datos incorrectos o vacíos recibidos");
    }

    try {
        // Obteniendo la página de destino
        var sheet = getTargetSheet(hook_load);
        if (!sheet) {
            return sendResponse(false, "No se pudo encontrar la página especificada");
        }

        // Creación de encabezados si la tabla está vacía
        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];
        }

        // Verificación de duplicados
        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; // gestión de encabezados
                    break;
                }
            }
        }

        // Preparación de datos para registrar
        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];
            }
        }

        // Guardando datos en la tabla
        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, "Datos guardados con éxito");

    } catch (error) {
        return sendResponse(false, "Error al guardar los datos: " + error.message);
    }
}