En e-commerce, consolidar datos marca la diferencia. Sin una vista única, el reporting cae en silos y las decisiones llegan tarde. Los informes de Data Explorer muestra el rendimiento en Connectif, pero para medir el impacto real junto a Google Ads, Meta y otras plataformas es conveniente llevar esos informes a un entorno común.
En este artículo vamos a explicar cómo sincronizar informes de Data Explorer en Google Sheets mediante Apps Script. La idea es volcar los datos en una hoja y usarla como fuente de datos en Looker Studio, Power BI o cualquier App que pemita conectar como origen de datos una Gsheet.
Connectif no dispone de conectores nativos para exportar informes a Looker, Power Bi etc. pero sí dispone de una API para exportar los informes creados en Data Explorer. Partiendo de este punto, vamos a ver cómo importar esos informes en Google Sheets usando la API de Connectif y Apps Script para posteriormente utilizar el Gsheets como fuente de datos en Looker Studio o POwer BI. Puede parecer complejo pero no lo es :-) Al final del artículo os dejamos enlace a Google Sheets con la plantilla base para poder copiar y customizar.
Qué vamos a ver:
- Extracción de datos de uno o varios informe de Data Explorer mediante la API.
- Volcado en Google Sheets.
- Programación de actualizaciones automáticas con triggers de Apps Script.
- Conexión de la hoja como fuente en Looker Studio y validación básica.
Caso de uso: análisis semanal de campañas de email en Looker Studio.
Un enfoque práctico consiste en programar la exportación semanal de informes de Data Explorer para evaluar el impacto de cada campaña en un periodo de tiempo y construir dashboards de seguimiento, entre otros usos, para:
- Comparar métricas de email por campaña: entregas, aperturas, clics, CTR, rebotes y bajas.
- Detectar tendencias semana a semana y variaciones por asunto o segmento.
- Combinar estas métricas con otras fuentes (p. ej., Google Ads, Meta Ads, GA4, CRM) para análisis cross-channel.
- Evaluar eficiencia por canal: coste e inversión publicitaria frente a aperturas, clics y conversiones atribuidas a email. Identificar campañas y workflows con mejor rendimiento para escalar.
Para complementar este análisis con la parte más técnica de la entregabilidad, puedes consultar esta recopilación de herramientas de email marketing , donde se incluyen verificadores de autenticación, monitorización de reputación y utilidades para diagnóstico avanzado.
¿Qué es Google Apps Script?
Google Apps Script es una plataforma de desarrollo basada en JavaScript para automatizar y extender funcionalidades de los productos de Google Workspace.
Características principales
- Basado en JavaScript (ES6).
- Se ejecuta en la nube de Google (serverless).
- No requiere instalación ni configuración local.
- Editor web integrado con depurador.
Capacidades de integración de Apps Script
- Conexión nativa con Gmail, Google Sheets, Drive, Calendar, Docs, etc.
- Posibilidad de exponer APIs REST básicas (Get/Post).
- Consumo de APIs externas.
- Soporte de webhooks y triggers automáticos.
Casos de uso de sincronización de datos con Apps Script
- Automatizar transferencias entre Google Sheets y sistemas externos.
- Crear conectores personalizados para CRMs, ERPs o bases de datos.
- Desarrollar middlewares ligeros para integraciones API-to-API.
- Documentación oficial de Google Apps Script
Data Explorer de Connectif: métricas y dimensiones para reporting
Es el área de reporting de Connectif. En ella, mediante la combinación de métricas y dimensiones permite analizar el impacto de campañas y workflows de forma sencilla.
Qué permite Data Explorer para el análisis de campañas
- Construir informes agregados por campaña, día o segmento.
- Comparar resultados entre periodos y detectar tendencias.
- Guardar informes reutilizables; cada informe dispone de un
reportIdconsultable vía API.
Requisitos previos: Connectif, Google Sheets y Apps Script
- Acceso a Connectif & API Token.
Credenciales de la API de Connectif con permisos de lectura y escritura de “Exports” y “Imports” - Report IDs necesarios.
Listado dereportIdde los informes a sincronizar. - Cuenta de Google con acceso a Google Sheets y Apps Script.
Permisos para crear/editar hojas, ejecutar Apps Script.
Script de sincronización de Data Explorer a Google Sheets vía API de Connectif
El objetivo es simple: lanzar la exportación del informe en Data Explorer, esperar a que se genere, descargar el archivo e importarlo en Google Sheets. Además, se registra un log de ejecución con el rango de fechas, el número de registros y el estado para facilitar el seguimiento.
function importDataExplorer() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheetConfig = ss.getSheetByName("Settings"); // Config sheet
if (!sheetConfig) {
sheetConfig = ss.insertSheet("Settings");
sheetConfig.getRange("A1").setValue("Start date");
sheetConfig.getRange("B1").setValue("End date");
sheetConfig.getRange("C1").setValue("Id Report");
Logger.log("Set the dates in the 'Settings' sheet before running the script.");
return;
}
// Log Function
function registerExecution(executionDate, dateRange , entries, status, nameSheet) {
var logSheet = ss.getSheetByName("ExecutionLog");
if (!logSheet) {
logSheet = ss.insertSheet("ExecutionLog");
logSheet.appendRow(["Execution Date", "Date Range", "Records", "Status", "Sheet"]);
}
var lastRow = logSheet.getLastRow() + 1;
logSheet.getRange(lastRow, 1, 1, 5).setValues([[executionDate, dateRange , entries, status, nameSheet]]);
}
// Getting ApiKey
const scriptProperties = PropertiesService.getScriptProperties();
const cnApiKey = scriptProperties.getProperty('apikey');
if (!cnApiKey) {
Logger.log("ERROR: The API key is not configured in the script properties.");
return;
}
// Getting dates from the 'Settings' sheet
var fromDate = sheetConfig.getRange("A2").getValue();
if (!(fromDate instanceof Date)) {
var today = new Date();
fromDate = new Date(today.getFullYear(), today.getMonth(), 1);
}
var toDate = sheetConfig.getRange("B2").getValue();
if (!(toDate instanceof Date)) {
toDate = new Date(); // If it is not a valid date, use TODAY
}
// Formatting dates in YYYY-MM-DD format.
fromDate = Utilities.formatDate(fromDate, Session.getScriptTimeZone(), "yyyy-MM-dd");
toDate = Utilities.formatDate(toDate, Session.getScriptTimeZone(), "yyyy-MM-dd");
// Getting multiple report IDs and sheet names from Settings (from row 2)
var lastRow = sheetConfig.getLastRow();
var reportData = sheetConfig.getRange(2, 3, lastRow - 1, 2).getValues(); // C2:D
var reportList = reportData.filter(row => row[0] && row[1]); // Exclude empty rows
if (reportList.length === 0) {
Logger.log("ERROR: No report IDs and sheet names configured in Settings (from C2:D).");
return;
}
Logger.log("Using date range: " + fromDate + " a " + toDate);
// Post Petition
const apiUrl = "https://api.connectif.cloud/exports/type/data-explorer";
const headers = {
"Authorization": cnApiKey,
"Content-Type": "application/json"
};
reportList.forEach(([reportIdValue, nameSheet]) => {
Logger.log("Importing report '" + nameSheet + "' with reportId: " + reportIdValue);
var payload = JSON.stringify({
"delimiter": ";",
"filters": {
"reportId": reportIdValue,
"fromDate": fromDate,
"toDate": toDate
}
});
var postOptions = {
method: "post",
headers: headers,
payload: payload,
muteHttpExceptions: true
};
// Response
var postResponse = UrlFetchApp.fetch(apiUrl, postOptions);
var postData = JSON.parse(postResponse.getContentText());
if (!postData.id) {
Logger.log("No ID was obtained for the report: " + nameSheet);
registerExecution(toDate, fromDate + " → " + toDate, 0, "Error: No ID was obtained for " + nameSheet, nameSheet);
return;
}
var reportId = postData.id;
Logger.log("ID obtained for '" + nameSheet + "': " + reportId);
// Conf retries
var maxRetries = 5;
var retry = 0;
var fileUrl = null;
while (retry < maxRetries) {
Utilities.sleep(5000);
try {
var apiUrlGet = "https://api.connectif.cloud/exports/" + reportId;
var optionsGet = {
method: "get",
headers: headers,
muteHttpExceptions: true
};
var responseGet = UrlFetchApp.fetch(apiUrlGet, optionsGet);
var dataGet = JSON.parse(responseGet.getContentText());
if (dataGet.fileUrl) {
fileUrl = dataGet.fileUrl;
break;
}
} catch (e) {
Logger.log("Attempt " + (retry + 1) + " failed for '" + nameSheet + "'. Retrying...");
}
retry++;
}
if (!fileUrl) {
Logger.log("Failed to get fileUrl for '" + nameSheet + "' after " + maxRetries + " attempts.");
registerExecution(toDate, fromDate + " → " + toDate, 0, "Error: No fileUrl obtained for " + nameSheet, nameSheet);
return;
}
Logger.log("URL of the ZIP file obtained for '" + nameSheet + "': " + fileUrl);
// Getting the CSV
var zipBlob = UrlFetchApp.fetch(fileUrl).getBlob();
var archivos = Utilities.unzip(zipBlob);
var csvContent = null;
for (var i = 0; i < archivos.length; i++) {
if (archivos[i].getName().endsWith(".csv")) {
csvContent = archivos[i].getDataAsString();
break;
}
}
if (!csvContent) {
Logger.log("No CSV file found inside the ZIP for '" + nameSheet + "'.");
registerExecution(toDate, fromDate + " → " + toDate, 0, "Error: No CSV in ZIP for " + nameSheet, nameSheet);
return;
}
// Processing CSV
var rows = Utilities.parseCsv(csvContent, ";");
if (rows.length === 0) {
Logger.log("El CSV está vacío para '" + nameSheet + "'.");
registerExecution(toDate, fromDate + " → " + toDate, 0, "Error: CSV vacío para " + nameSheet, nameSheet);
return;
}
// Inserting data to sheet
var targetSheet = ss.getSheetByName(nameSheet);
if (!targetSheet) {
targetSheet = ss.insertSheet(nameSheet);
}
var lastRow = targetSheet.getLastRow();
if (lastRow === 0) {
targetSheet.getRange(1, 1, rows.length, rows[0].length).setValues(rows);
} else {
targetSheet.getRange(lastRow + 1, 1, rows.length - 1, rows[0].length).setValues(rows.slice(1));
}
//Calculating the number of entries added
var importedRows = rows.length - 1;
registerExecution(toDate, fromDate + " → " + toDate, importedRows, "Success: Import Completed for " + nameSheet, nameSheet);
Logger.log("CSV import completed for '" + nameSheet + "'.");
}); //End foreach
// Setting dates after adding data
var toDateParsed = new Date(toDate);
var nextFromDate = new Date(toDateParsed.getTime() + 24 * 60 * 60 * 1000);
for (var i = 0; i < reportData.length; i++) {
var reportId = reportData[i][0];
var sheetName = reportData[i][1];
if (reportId && sheetName) {
var rowIndex = i + 2; // +2 porque reportData empieza en fila 2
sheetConfig.getRange(rowIndex, 1).setValue(nextFromDate); // Columna A (Start Date)
}
}
Logger.log("Process completed successfully. Timestamps have been updated.");
}
Preparar Google Sheets para la sincronización
El primer paso es configurar Google Sheets con los parámetros necesarios para poder lanzar la sincro.
Nombre de la pestaña Settings y encabezados de columna
- Cambia el nombre de la hoja a “Settings”
- Indica los nombres de las columnas:
- A1:
Start date - B1:
End date - C1:
Id Report - D1:
Sheet name← nombre de la pestaña de salida para ese informe
- A1:
Valores de las celdas desde la fila 2 en Settings
- A2 (
Start date): fecha inicial del rango (formato fecha, no texto). - B2 (
End date): fecha final del rango (opcional). - C2 (
Id Report):reportIddel informe en Data Explorer. - D2 (
Sheet name): nombre de la pestaña destino. Si no existe, el script la crea.
Añadir una fila por cada Data Explorer Report a sincronizar.
Copiar el script en Apps Script (proyecto vinculado a la hoja)
- Haz clic en extensions y selecciona “Apps Script”
- Indica el nombre del proyecto.
- Copia y pega el script
- Guardar
Configurar API Token de Connectif.
En este punto vamos a almacenar el API Token de Connectif como una propiedad del script para no exponerlo en las celdas de Google Sheet. Es importante que el API token generado en Connectif disponga de los permisos de lectura y escritura para exportaciones e importaciones.
-
Ir a Project Settings (icono ⚙️).
-
En Script properties (o Edit script properties), pulsar Add script property.
-
Key:
apikey
Value: el token en el formato que requiera la API en el caso de Connectif “apiKey XXXXXXX:XXXXXX”
-
Guardar.
Añadir los reportId de Data Explorer (Connectif)
Cada informe guardado en Data Explorer tiene un identificador único (reportId). Se obtiene desde la URL del informe.
Cómo localizarlo
- Abrir Data Explorer y acceder al informe.
- En la barra del navegador, copiar el último segmento de la URL, justo después de
/data-explorer-report/.
Ejemplo:
- url: https://eu4.connectif.cloud/store/345432234234238/data-explorer-report/123456789012345
- reportId = 123456789012345
Dónde colocarlo en la hoja
- En la pestaña
Settings:- Columna C (
Id Report): pegar elreportId. - Columna D (
Sheet): nombre de la pestaña destino para ese informe.
- Columna C (
- Añadir una fila por informe que se quiera sincronizar.hugo s Notas
- Copiar solo el identificador (sin parámetros
?ni#). - Evitar espacios en blanco al inicio/fin.
- Si el informe no está guardado en Connectif, no se habrá generado el
reportId.
Ejecutar el script de sincronización por primera vez
Una vez configurado los id report, tan solo queda ejecutar el script.
-
Desde Apps Script, clic en “Run”.
-
La primera vez que se ejecute, Google solicitará una serie de autorizaciones:
- clic en “Review Permissions”
- Clic en “Advanced”
- Selecciona la cuenta y clic en “Go to [nombre app]”
- Selecciona “Select All” y “Continue”
Sincronización y seguimiento de la ejecución
Tras aceptar los permisos, el script se ejecuta y sincroniza los informes de Data Explorer (Connectif) con Google Sheets. Para cada reportId, exporta, descarga el ZIP, extrae el CSV y escribe los datos en la pestaña que se haya indicado.
Dónde revisar el estado
- En Apps Script puedes revisar el log de la ejecución.
- Hoja
ExecutionLog: registra fecha de ejecución, rango de fechas, número de registros, estado y pestaña.
Qué verificar
- Pestañas de destino con cabeceras y filas añadidas.
ExecutionLogcon estadoSuccesso mensaje de Error si algo falla.
Gestión de fechas: Start date y End date
Durante la ejecución
- Lee
Start date(A2) yEnd date(B2) de la pestañaSettings. - Si no hay fechas:
Start date⇒ primer día del mes actual.End date⇒ hoy.
- Formato aplicado: YYYY-MM-DD en la zona horaria del script.
Al finalizar
- Actualiza
Start dateaEnd date + 1 díapara evitar solapes. - Limpia
End datepara que en la siguiente ejecución vuelva a usarse hoy por defecto.
Automatización con triggers en Apps Script
El área de triggers permite programar la ejecución automática de funciones en Apps Script. Para este proyecto se utiliza un trigger de tiempo sobre la función importDataExplorer.
Crear el trigger de tiempo
- Abrir Extensiones → Apps Script.
- Ir a la sección Triggers (icono de reloj) y pulsar Add Trigger.
- Configurar:
- Choose which function to run:
importDataExplorer - Select event source:
Time-driven - Type of time based trigger:
Day timer(oHour timersi se prefiere) - Time of day / Interval: seleccionar franja (p. ej., 06:00)
- Failure notification settings:
Notify me immediately
- Choose which function to run:
- Guardar. Si es la primera vez, se solicitarán permisos.
Frecuencia recomendada y control de cuotas
- Diario a primera hora para consolidación (ej.: 06:00).
- Horaria si se necesitan actualizaciones más frecuentes.
- Evitar intervalos muy cortos para no rozar cuotas de Apps Script.
Buenas prácticas de automatización
- Un trigger por hoja (por copia), alineado con la zona horaria del reporting.
- Escalonar ejecuciones entre cuentas para evitar picos de carga.
- Mantener rangos contiguos de fechas (
Start date/End date) para evitar duplicados. - Monitorizar
ExecutionLogtras cada pase y ajustar si aparecen errores. - Configurar notificaciones de fallo en “inmediato”.
El trigger ejecutará
importDataExplorercon la configuración deSettings, actualizará las fechas automáticamente y dejará los datos listos para su consumo en Looker Studio.
Crear la fuente de datos en Looker Studio desde Google Sheets
Conectar Google Sheets como fuente en Looker Studio
- Abrir Looker Studio y seleccionar Crear → Fuente de datos.
- Elegir conector Google Sheets.
- Seleccionar el archivo y la pestaña (p. ej.,
Purchases). - Marcar Usar la fila 1 como encabezados.
- (Opcional) Desmarcar Incluir celdas ocultas y filtradas para evitar ruido.
- Clic en Conectar.
- Revisar el esquema y pulsar Crear informe (o Añadir al informe).
Plantilla de sincronización Connectif Data Explorer → Google Sheets (Apps Script)
Dejamos enlace a plantilla en Google Sheets. Cada usuario trabaja sobre su propia copia y es responsable de adaptar cambios.