Central de ajuda KWIGA Serviços, integrações, API, Configurações Serviços Data export to Google Sheets

Data export to Google Sheets

Artigos:

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


Você pode configurar a exportação de dados para vários eventos usando a automação (você pode especificar contato adicionado, tag adicionada, compra bem-sucedida ou malsucedida etc. como evento; a lista completa de eventos está disponível no artigo).

Além disso, você pode usar a opção de enviar um webhook ao usar widgets; o fluxo de trabalho permanece o mesmo.

Principais etapas:

  1. Crie um arquivo e adicione o script a ele

  2. Crie um aplicativo da web e obtenha o link para enviar o webhook

  3. Configure o envio de webhook usando a automação no Kwiga ou o envio de formulário no widget.

Todo o processo é mostrado no vídeo e não requer conhecimento de programação. Basta seguir as etapas fornecidas e, se algo não funcionar, entre em contato com o suporte.

 

Etapa 1: Crie um arquivo para onde os dados do Kwiga serão enviados

Abra Google Sheets e crie um novo arquivo; em seguida, abra o editor de scripts.

Uma nova janela será aberta, e você precisará colar o script no editor. Você pode baixar o script pelo link (ou copiar o texto no final do artigo). Você precisa excluir todo o texto que já está no editor.

Resultado final:

Etapa 2: Crie um aplicativo da web e obtenha o link para enviar o webhook

No mesmo editor de scripts, encontre o botão Deploy e selecione New deployment

Selecione Web app como o tipo e, na lista suspensa Who has access, defina como Everyone e clique em Deploy.

Como resultado, você receberá a Web App URL, que depois deverá adicionar no Kwiga.

 

Etapa 3: Configure o envio de dados no Kwiga

Clique no botão All solutions no menu superior e selecione Automation. Crie um novo gatilho e escolha o evento que iniciará a automação. Pode ser contato adicionado, tag adicionada, pagamento ou qualquer outro evento.

Depois disso, role para baixo e selecione Webhook - Send data nas ações. No campo de link, especifique a Web App URL, o tipo de solicitação POST e selecione os campos que devem ser exportados para a tabela.

Salve, e todas as etapas estarão concluídas.

 

Como alternativa, você pode configurar o envio de webhook a partir do widget; isso está disponível ao usar o elemento Form. Marque a opção Additionally send to a third-party service e, em seguida, no formulário que abrir, adicione o link, o tipo de solicitação POST e selecione os parâmetros a serem enviados. Somente os parâmetros presentes no formulário (neste widget) estarão disponíveis nesta lista.

 

Como funciona o script do Google Sheets para webhooks

  • Na primeira chamada do webhook, os cabeçalhos da tabela são criados automaticamente com base nas chaves dos dados recebidos
  • Se a tabela já tiver cabeçalhos e for necessário começar a receber novos campos de dados, adicione esses cabeçalhos manualmente na tabela
  • Os cabeçalhos podem ser rearranjados na tabela - o script identificará automaticamente suas posições
  • Por padrão, o script adiciona novos registros a cada recebimento de webhook
  • Se especificar campos em keyColumns, o script atualizará registros existentes ou adicionará novos se não encontrar correspondência
  • ⚠️ Importante: Após modificar o script, é necessário fazer um novo deploy no Google Apps Script e atualizar o link do webhook

Seleção da folha da tabela:

  • Por padrão, a folha ativa é usada
  • Pode ser redefinido através dos parâmetros do webhook:
  • "sheet_name": "Nome da folha" - para selecionar a folha pelo nome
  • "sheet_index": 2 - para selecionar a folha pelo número (começando por 1)
// ============================================================
// CONFIGURAÇÕES DO SCRIPT
// ============================================================

// Verificação de duplicatas - especifique os campos para procurar registros existentes
// Exemplos de uso:
// var keyColumns = ["email"];           - verificação por email
// var keyColumns = ["order_id"];        - verificação por ID do pedido
// var keyColumns = ["email", "order_id"];  - verificação por vários campos
var keyColumns = []; // Verificação de duplicatas desativada

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

// Função para enviar resposta
function sendResponse(success, message) {
    var response = {
        "status": success ? "success" : "error",
        "message": message
    };
    return ContentService.createTextOutput(JSON.stringify(response))
        .setMimeType(ContentService.MimeType.JSON);
}

// Obtendo a página de destino para gravar dados
function getTargetSheet(hook_data) {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

    // Verificando se o nome da página está especificado
    if (hook_data && hook_data.sheet_name) {
        try {
            var sheet = spreadsheet.getSheetByName(hook_data.sheet_name);
            if (sheet) {
                return sheet;
            }
        } catch (error) {
            // Página não encontrada
        }
    }

    // Verificando se o número da página está especificado
    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; // Convertendo para índice a partir de 0
            if (index >= 0 && index < sheets.length) {
                return sheets[index];
            }
        } catch (error) {
            // Índice de página inválido
        }
    }

    // Por padrão, usar a página ativa
    return SpreadsheetApp.getActiveSheet();
}

// Cria cabeçalhos na tabela com base nos dados fornecidos
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;
}

// Processamento de webhook de entrada
function doPost(e) {
    var hook_load = null;

    // Verificando a presença de dados POST
    if (!e || !e.postData || !e.postData.contents) {
        return sendResponse(false, "Sem dados para processar");
    }

    // Analisando dados JSON
    try {
        hook_load = JSON.parse(e.postData.contents);
    } catch (error) {
        return sendResponse(false, "Erro ao analisar dados JSON");
    }

    // Validação dos dados recebidos
    if (!hook_load || typeof hook_load !== 'object' || Object.keys(hook_load).length === 0) {
        return sendResponse(false, "Dados incorretos ou vazios recebidos");
    }

    try {
        // Obtendo a página de destino
        var sheet = getTargetSheet(hook_load);
        if (!sheet) {
            return sendResponse(false, "Não foi possível encontrar a página especificada");
        }

        // Criar cabeçalhos se a tabela estiver vazia
        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];
        }

        // Verificação de duplicatas
        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; // gerenciamento de cabeçalhos
                    break;
                }
            }
        }

        // Preparação de dados para gravação
        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];
            }
        }

        // Salvando dados na tabela
        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, "Dados salvos com sucesso");

    } catch (error) {
        return sendResponse(false, "Erro ao salvar dados: " + error.message);
    }
}