TL;DR
- Un script gratuito de Google Apps Script consolida tus datos de Google Ads y Meta Ads en una sola hoja "All Ads", en el mismo formato, lista para Looker Studio o una tabla dinámica. El código completo y el enlace a GitHub están en este artículo.
- Hace una cosa bien: leer dos hojas de origen, normalizar los nombres de campaña a mayúsculas y escribir todo en una hoja unificada, limpiando antes los datos anteriores para que las ejecuciones no dupliquen.
- No extrae los datos de las plataformas. Sigues necesitando un conector (Dataslayer tiene plan gratuito) para llevar Google Ads y Meta a Sheets; el script sustituye la consolidación de pago, no la extracción.
- Por qué merece la pena: leer desde Google Sheets hace que Looker Studio cargue al instante, porque lee datos ya almacenados en lugar de llamar a la API de cada plataforma en vivo cada vez que se abre el informe.
- Coste: el script es gratis. Supermetrics empieza en unos €29/mes facturado anualmente y, a fecha de 2026, solo ofrece facturación anual (Supermetrics, 2026).
Durante años mis lunes empezaban igual: Google Ads en una pestaña, Meta en otra, exportar dos CSVs, arreglar a mano los nombres de campaña para que coincidieran, y solo entonces empezar el análisis de verdad. Cada semana. En algún momento me cansé y escribí un script de Google Apps Script de 40 líneas que hace la parte aburrida por mí, consolidando Google Ads y Meta en una sola hoja limpia, gratis, sin ampliar Supermetrics. Lo llevo usando en dashboards de cliente más de un año. Aquí tienes el script entero, listo para copiar y pegar, y cómo montarlo sin saber programar.
El problema real del reporting multicanal: tres fricciones
Si gestionas campañas en Google Ads y Meta Ads al mismo tiempo, probablemente reconoces alguna de estas situaciones:
1. No puedes ver los datos agregados de ambas plataformas en un solo sitio
Google Ads tiene su interfaz. Meta tiene la suya. Cada una con sus propias métricas, sus propias columnas y su propia lógica de navegación. Cuando necesitas una visión global, cuánto has gastado en total, cuántas impresiones has generado entre los dos canales, cuál tiene mejor coste por clic, tienes que abrir dos pestañas, exportar dos archivos y cruzar los datos manualmente. Cada vez.
2. Tu informe tiene dos bloques separados, uno por canal, en vez de una vista unificada
La consecuencia directa del punto anterior es que la mayoría de informes acaban estructurados así: una sección para Google, una sección para Meta. Dos tablas, dos gráficos, dos lógicas. Eso funciona si tu objetivo es revisar cada canal por separado, pero no si quieres tomar decisiones de distribución de presupuesto entre canales, identificar sinergias o analizar el rendimiento agregado de toda tu inversión publicitaria.
3. Los conectores directos a Looker Studio son lentos e inestables
Herramientas como Dataslayer o Supermetrics permiten conectar Google Ads y Meta directamente a Looker Studio sin pasar por Google Sheets. Sobre el papel es la solución más cómoda. En la práctica tiene un problema técnico importante: cada vez que el informe se abre o se refresca, el conector hace una llamada en tiempo real a la API de cada plataforma para reconstruir los datos desde cero. Eso se traduce en tiempos de carga elevados y en fallos intermitentes cuando la API no responde.
Google Sheets, en cambio, actúa como una base de datos ya construida. Los datos están ahí, almacenados, y Looker Studio los lee de forma instantánea sin ninguna llamada externa en el momento de cargar el informe. La diferencia en velocidad y fiabilidad es notable.
Importante: este script no elimina la necesidad de un conector para extraer los datos iniciales de cada plataforma. Seguirás necesitando Dataslayer u otra herramienta similar para llevar los datos a Google Sheets. Lo que el script hace es darte mucha más flexibilidad sobre cómo estructuras y consolidas esos datos, sin ampliar tu licencia ni depender de funcionalidades avanzadas del conector.
Qué hace este script: consolidación automática de campañas multicanal
El script es una función de Google Apps Script, el motor de automatización nativo de Google Sheets, que realiza tres tareas en una sola ejecución:
- Lee datos de dos hojas de origen: una con los datos de Google Ads y otra con los de Meta Ads.
- Normaliza los nombres de campaña a mayúsculas, eliminando errores por inconsistencias tipográficas.
- Escribe todos los datos en una hoja unificada llamada "All Ads", limpiando primero cualquier dato anterior para evitar duplicados.
El resultado es una hoja de cálculo que contiene todas tus campañas, de Google y de Meta, en el mismo formato, con los mismos campos, lista para conectar con cualquier dashboard o para analizar directamente con tablas dinámicas.

Este script vs pagar Supermetrics: comparativa honesta
Para ser claro sobre lo que de verdad te ahorras: el script sustituye el trabajo de consolidación de pago, no el conector que extrae los datos. Aquí tienes el cara a cara honesto.
| Este script (Apps Script) | Conector en plan de pago (p. ej. Supermetrics) | |
|---|---|---|
| Coste | Gratis | Desde ~€29/mes, solo facturación anual en 2026 |
| Extrae datos de las APIs | No, necesitas un conector | Sí |
| Consolida Google + Meta en una hoja | Sí | Sí (planes superiores) |
| Velocidad en Looker Studio | Instantánea (lee de Sheets) | Depende de llamadas a API en vivo |
| Normaliza nombres de campaña | Sí (a mayúsculas) | Según configuración |
| Requiere programar | No (copiar y pegar) | No |
| Mantenimiento | Tú (código propio) | Soporte del proveedor |
Precios de Supermetrics: supermetrics.com/pricing (2026). Los planes de Meta/Dataslayer varían.
Cómo llegan los datos a Google Sheets
Antes de ejecutar el script, necesitas tener los datos de Google Ads y Meta Ads en dos hojas separadas dentro del mismo Google Sheet. Hay varias formas de conseguirlo:
- Dataslayer: un conector con plan gratuito (y planes de pago para mayor volumen) que extrae datos directamente desde las APIs de Google Ads y Meta Ads hacia Google Sheets. Es la opción utilizada en el ejemplo de este artículo.
- Google Ads Reports: Google tiene su propio add-on nativo para exportar datos de campañas a Sheets.
- Exportación manual: si el volumen de datos es pequeño, exporta los CSVs desde cada plataforma e impórtalos en las hojas correspondientes.
Regla clave: mismo orden de columnas en ambas hojas
El script lee las columnas por posición, no por nombre. Esto significa que el orden en que configures las métricas y dimensiones en una plataforma debe ser exactamente el mismo en la otra. Si en Google Ads la primera columna es el nombre de campaña, la segunda es la fecha y la tercera es impresiones, Meta Ads debe tener exactamente ese mismo orden.
Ejemplo correcto: Campaña → Fecha → Impresiones → Clics → Coste → Fuente (en ambas hojas, en este orden). Si una hoja tiene las columnas en un orden distinto, los datos se mezclarán incorrectamente en la hoja unificada.
La columna Source: por qué es imprescindible
La última columna de cada hoja debe ser una columna personalizada llamada Source (o Fuente) que identifique el canal de origen de cada fila. Esta columna no la exporta ninguna plataforma de forma nativa, la tienes que añadir tú manualmente como columna fija con un valor constante.
- En la hoja de Google Ads: todas las filas tienen el valor GOOGLE en esta columna.
- En la hoja de Meta Ads: todas las filas tienen el valor FACEBOOK en esta columna.
El script usa esta columna como filtro de calidad: descarta cualquier fila en la que Source esté vacía. Además, una vez consolidados los datos, Source se convierte en una dimensión de filtro en Looker Studio, puedes segmentar cualquier gráfico por canal con un solo clic.


El script: código completo y explicación línea por línea
A continuación tienes el código completo del script. En el siguiente apartado lo explicamos en detalle para que entiendas exactamente qué hace cada parte, incluso si nunca has trabajado con Google Apps Script.
function combinarFilas() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
// Hojas de origen
var hojas = ["Google Ads", "Meta Ads"];
// Hoja de destino
var combinedSheet = ss.getSheetByName("All Ads");
if (!combinedSheet) {
combinedSheet = ss.insertSheet("All Ads");
}
// Copiamos cabeceras de la primera hoja
var headers = ss.getSheetByName("Google Ads")
.getRange(1, 1, 1, 6).getValues()[0];
// Limpiamos datos anteriores
combinedSheet.clear();
combinedSheet.getRange(1, 1, 1, headers.length).setValues([headers]);
var data = [];
// Iteramos por cada hoja de origen
hojas.forEach(function(hoja) {
var sheet = ss.getSheetByName(hoja);
if (sheet) {
var lastRow = sheet.getLastRow();
if (lastRow > 1) {
var values = sheet.getRange(2, 1, lastRow - 1, 6).getValues();
// Convertir columna 1 (Campaña) a MAYÚSCULAS
for (var i = 0; i < values.length; i++) {
if (values[i][0]) {
values[i][0] = String(values[i][0]).trim().toUpperCase();
}
}
data = data.concat(values);
}
}
});
// Filtra filas con valor en columna 6 (métrica clave)
var filteredData = data.filter(function(row) {
return row[5] !== '';
});
// Escribe datos combinados
if (filteredData.length > 0) {
combinedSheet.getRange(2, 1, filteredData.length, headers.length)
.setValues(filteredData);
}
Logger.log(filteredData.length + " filas combinadas.");
}¿Qué hace cada parte del script?
- Identificar las hojas de origen. El script empieza declarando un array con los nombres exactos de las dos hojas a combinar: "Google Ads" y "Meta Ads". Si las tuyas se llaman distinto, cambia esas cadenas para que coincidan exactamente con el nombre de tus pestañas.
- Crear la hoja de destino si no existe. El script busca una hoja llamada "All Ads". Si no la encuentra, la crea automáticamente, así puedes ejecutarlo en un Google Sheet nuevo sin preparar nada.
- Limpiar datos anteriores. Antes de escribir nada, el script limpia la hoja de destino, así cada ejecución parte de cero y reescribe con los datos actuales en lugar de acumular duplicados.
- Convertir nombres de campaña a mayúsculas. Los nombres en Google Ads y Meta a veces tienen mayúsculas y minúsculas mezcladas. Para cruzar datos más adelante, el mismo nombre debe tener siempre el mismo formato, así que el script los pone todos en mayúsculas.
- Filtrar filas vacías. El script elimina cualquier fila en la que la columna 6 (Source: GOOGLE o FACEBOOK) esté vacía, una limpieza básica de datos.
- Escribir los datos consolidados. Una vez combinados y filtrados, el script los escribe de una sola vez en bloque, mucho más rápido que fila por fila cuando tienes miles de filas.
Guía de implementación paso a paso
A continuación tienes las instrucciones exactas para configurar y ejecutar este script en tu Google Sheet. No necesitas conocimientos de programación previos.
Paso 1: Prepara tu Google Sheet
Asegúrate de que tu Google Sheet tiene al menos dos hojas con datos de campaña: una para Google Ads y otra para Meta Ads. Puedes llamarlas como quieras, pero el nombre debe coincidir exactamente con el que pongas en el script. Las columnas deben estar en el mismo orden en ambas hojas, porque el script lee por posición, no por nombre. Por ejemplo: Nombre de campaña, Fecha, Impresiones, Clics, Coste y luego Source. Añade la columna Source manualmente al final de cada hoja, GOOGLE en la de Google Ads, FACEBOOK en la de Meta Ads. Si usas Dataslayer, puedes configurar Source como dimensión personalizada directamente en la consulta.
Paso 2: Abre el editor de Apps Script
En tu Google Sheet, haz clic en el menú superior "Extensiones", luego "Apps Script". Se abrirá una nueva pestaña con el editor de código. Tienes la referencia completa en la documentación de Apps Script.

Paso 3: Pega el script
Borra cualquier código por defecto del editor (normalmente una función vacía llamada myFunction), copia el código completo de la sección anterior, pégalo y guarda con el icono de disco o Ctrl+S / Cmd+S.

Paso 4: Ejecuta el script por primera vez
Con el script guardado, haz clic en "Ejecutar" (el triángulo de reproducción) en la barra superior. La primera vez, Google te pedirá autorizar el script para acceder a tu hoja, acepta los permisos. Espera unos segundos; al terminar verás un mensaje en el registro de ejecución. De vuelta en tu Google Sheet, verás una nueva pestaña "All Ads" con todos los datos combinados.

Paso 5 (opcional): Programar la ejecución automática
Si quieres que el script se ejecute automáticamente, por ejemplo cada mañana para tener los datos del día anterior, configura un activador temporal desde el editor de Apps Script: haz clic en el icono del reloj ("Activadores") en el panel izquierdo, "Añadir activador", selecciona la función combinarFilas, el tipo "Basado en tiempo" y la frecuencia que necesites, y guarda.
Por qué esto es relevante para un Growth o Demand Gen Manager
Este script resuelve directamente las tres fricciones descritas al inicio:
- Una única fuente de verdad: en lugar de una pestaña para Google y otra para Meta, tienes una sola hoja con todos los datos en el mismo formato. Cualquier análisis parte del mismo origen.
- Informes unificados desde el primer momento: conecta la hoja consolidada a Looker Studio y construye un único informe con métricas agregadas de ambos canales, sin duplicar gráficos ni hacer cálculos manuales.
- Carga instantánea en Looker Studio: al leer desde Google Sheets en lugar de llamar a las APIs de Google Ads y Meta en tiempo real, los informes cargan de inmediato y sin fallos intermitentes. Sheets actúa como caché.
- Flexibilidad sin ampliar la licencia: con un conector en plan básico, este script te permite consolidar y estructurar los datos a tu medida sin pagar funcionalidades avanzadas.
- Normalización automática de nombres de campaña: los nombres en mayúsculas garantizan que las mismas campañas se agrupan correctamente, independientemente de cómo se crearon en cada plataforma.
En mis dashboards de cliente, llevar los datos a Sheets bajó informes de Looker Studio que tardaban ~30 segundos en cargar a ~2 segundos. No es un detalle técnico, es la diferencia entre un informe que se usa y uno que se evita.
Conclusión
El reporting multicanal no debería ser un problema de infraestructura. Si tienes los datos en Google Sheets, tienes todo lo que necesitas para construir una vista consolidada que cargue rápido, que no falle y que puedas personalizar a tu medida. Este script no reemplaza tu conector de datos, seguirás necesitando Dataslayer o similar para traer los datos de cada plataforma. Lo que hace es eliminar la fricción que viene después: los informes fragmentados por canal, los tiempos de carga elevados en Looker Studio y la dependencia de funcionalidades avanzadas que no siempre necesitas. Con 40 líneas de código y una configuración inicial de menos de una hora, tienes un sistema de reporting que funciona.
Descarga el script en GitHub
Accede al repositorio de GitHub con el código completo, listo para copiar y pegar en tu Google Sheet. Sin registro, sin coste, sin condiciones.
github.com/ferrerponseti