Al final d'aquest article trobaràs l'enllaç a GitHub amb l'script llest per fer servir.
El problema real del reporting multicanal: tres friccions que frenen la teva anàlisi
Si gestiones campanyes a Google Ads i Meta Ads alhora, probablement reconeixes alguna d'aquestes situacions:
1. No pots veure les dades agregades de totes dues plataformes en un sol lloc
Google Ads té la seva interfície. Meta té la seva. Cadascuna amb les seves mètriques, les seves columnes i la seva lògica de navegació. Quan necessites una visió global, quant has gastat en total, quantes impressions has generat entre els dos canals, quin té millor cost per clic, has d'obrir dues pestanyes, exportar dos arxius i creuar les dades manualment. Cada vegada.
2. El teu informe té dos blocs separats, un per canal, en lloc d'una vista unificada
La conseqüència directa del punt anterior és que la majoria d'informes acaben estructurats així: una secció per a Google, una secció per a Meta. Dues taules, dos gràfics, dues lògiques. Això funciona si el teu objectiu és revisar cada canal per separat, però no si vols prendre decisions de distribució de pressupost entre canals, identificar sinergies o analitzar el rendiment agregat de tota la teva inversió publicitària.
3. Els connectors directes a Looker Studio són lents i inestables
Eines com Dataslayer o Supermetrics permeten connectar Google Ads i Meta directament a Looker Studio sense passar per Google Sheets. Sobre el paper és la solució més còmoda. A la pràctica, té un problema tècnic important: cada vegada que l'informe s'obre o es refresca, el connector fa una crida en temps real a l'API de cada plataforma per reconstruir les dades des de zero. Això es tradueix en temps de càrrega elevats i en errors intermitents quan l'API no respon correctament.
Google Sheets, en canvi, actua com una base de dades ja construïda. Les dades hi són, emmagatzemades, i Looker Studio les llegeix de manera instantània sense haver de fer cap crida externa en el moment de carregar l'informe. La diferència en velocitat i fiabilitat és notable.
Important: aquest script no elimina la necessitat d'un connector per extreure les dades inicials de cada plataforma. Continuaràs necessitant Dataslayer o una altra eina semblant per portar les dades a Google Sheets. El que fa l'script és donar-te molta més flexibilitat sobre com estructures i consolides aquestes dades, sense haver d'ampliar la teva llicència ni dependre de funcionalitats avançades del connector.
Què fa aquest script: consolidació automàtica de campanyes multicanal
L'script que veuràs en aquest article és una funció de Google Apps Script, el motor d'automatització natiu de Google Sheets, que fa tres tasques en una sola execució:
- Llegeix dades de dos fulls d'origen: un amb les dades de Google Ads i un altre amb les de Meta Ads.
- Normalitza els noms de campanya: els converteix tots a majúscules i elimina errors per inconsistències tipogràfiques.
- Escriu totes les dades en un full unificat: anomenat "All Ads", netejant primer qualsevol dada anterior per evitar duplicats.
El resultat és un full de càlcul que conté totes les teves campanyes, de Google i de Meta, en el mateix format, amb els mateixos camps, llest per connectar amb qualsevol dashboard o per analitzar directament amb taules dinàmiques.

Com arriben les dades a Google Sheets
Abans d'executar l'script, necessites tenir les dades de Google Ads i Meta Ads en dos fulls separats dins del mateix Google Sheet. Hi ha diverses maneres d'aconseguir-ho:
- Dataslayer: un connector gratuït (amb pla de pagament per a més volum) que extreu dades directament des de les APIs de Google Ads i Meta Ads cap a Google Sheets. És l'opció que s'ha fet servir a l'exemple d'aquest article.
- Google Ads Reports: Google té el seu propi add-on natiu per exportar dades de campanyes a Sheets.
- Exportació manual: si el volum de dades és petit, pots exportar els CSV des de cada plataforma i importar-los als fulls corresponents.
Regla clau: el mateix ordre de columnes en tots dos fulls
L'script llegeix les columnes per posició, no per nom. Això vol dir que l'ordre en què configuris les mètriques i dimensions en una plataforma ha de ser exactament el mateix a l'altra. Si a Google Ads la primera columna és el nom de campanya, la segona és la data i la tercera són les impressions, Meta Ads ha de tenir exactament aquest mateix ordre.
Exemple correcte: Campanya → Data → Impressions → Clics → Cost → Font (en tots dos fulls, en aquest ordre). Si un full té les columnes en un ordre diferent, les dades es barrejaran incorrectament al full unificat.
La columna Source: per què és imprescindible
L'última columna de cada full ha de ser una columna personalitzada anomenada Source (o Font) que identifiqui el canal d'origen de cada fila. Aquesta columna no l'exporta cap plataforma de manera nativa, l'has d'afegir tu manualment com a columna fixa amb un valor constant.
- Al full de Google Ads: totes les files tenen el valor GOOGLE en aquesta columna.
- Al full de Meta Ads: totes les files tenen el valor FACEBOOK en aquesta columna.
L'script fa servir aquesta columna com a filtre de qualitat: descarta qualsevol fila en què la columna Source estigui buida. A més, un cop consolidades les dades al full unificat, la columna Source es converteix en una dimensió de filtre a Looker Studio, pots segmentar qualsevol gràfic per canal amb un sol clic.


L'script: codi complet i explicació línia per línia
A continuació tens el codi complet de l'script. A l'apartat següent l'expliquem en detall perquè puguis entendre exactament què fa cada part, fins i tot si no has treballat mai amb 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è fa cada part de l'script?
1. Identificar els fulls d'origen
L'script comença declarant un array amb els noms exactes dels dos fulls que vols combinar: "Google Ads" i "Meta Ads". Si en el teu cas els fulls tenen un altre nom, simplement canvia aquestes cadenes de text pel nom que hagis fet servir. L'script no imposa cap nom concret, l'únic important és que el nom al codi coincideixi exactament amb el nom de la pestanya al Google Sheet.
2. Crear el full de destinació si no existeix
L'script busca un full anomenat "All Ads". Si no el troba, el crea automàticament. Això vol dir que pots executar l'script en un Google Sheet nou sense haver de preparar res manualment. Igual que amb els fulls d'origen, pots canviar aquest nom al codi si en prefereixes un altre.
3. Netejar dades anteriors
Abans d'escriure res, l'script neteja tot el contingut del full de destinació. Això evita que cada execució acumuli dades duplicades a sobre de les anteriors. És un comportament important: l'script sempre parteix de zero i reescriu amb les dades actuals.
4. Convertir els noms de campanya a majúscules
Aquest és un dels punts més útils de l'script. Els noms de campanya a Google Ads i a Meta Ads de vegades barregen majúscules i minúscules segons com es van crear. Si vols fer anàlisis comparatives o creuar dades més endavant, necessites que el mateix nom de campanya tingui sempre el mateix format. L'script converteix tots els noms a majúscules automàticament.
5. Filtrar files buides
L'script elimina qualsevol fila en què la columna 6 (la font: GOOGLE o FACEBOOK) estigui buida. Això actua com una neteja bàsica de dades, descartant files sense informació rellevant que podrien distorsionar les anàlisis.
6. Escriure les dades consolidades
Un cop combinades i filtrades les dades de tots dos fulls, l'script les escriu d'una sola vegada al full de destinació. Aquesta operació en bloc és molt més ràpida que escriure fila per fila, cosa que és especialment rellevant quan tens milers de files de dades.
Guia d'implementació pas a pas
A continuació tens les instruccions exactes per configurar i executar aquest script al teu Google Sheet. No necessites coneixements previs de programació.
Pas 1: Prepara el teu Google Sheet
Assegura't que el teu Google Sheet té com a mínim dos fulls amb dades de campanya: un per a Google Ads i un altre per a Meta Ads. Els pots anomenar com vulguis, però recorda que el nom que facis servir aquí haurà de coincidir exactament amb el que posis a l'script més endavant.
Les columnes han d'estar en el mateix ordre en tots dos fulls. L'script llegeix les dades per posició, no per nom de columna. Tria les mètriques i dimensions que necessitis al teu connector (Dataslayer o un altre), però configura-les en el mateix ordre a Google Ads i a Meta Ads. Per exemple:
- Columna 1: Nom de campanya
- Columna 2: Data
- Columna 3: Impressions
- Columna 4: Clics
- Columna 5: Cost
- Columna 6: Source (consulta les instruccions a continuació)
Afegeix una columna Source manualment. Cap plataforma no exporta aquesta columna de manera nativa, així que l'has d'afegir tu com a columna fixa al final de cada full. Al full de Google Ads, omple tota la columna amb el valor GOOGLE. Al full de Meta Ads, omple tota la columna amb el valor FACEBOOK. Si fas servir Dataslayer, pots configurar aquesta columna com una dimensió personalitzada directament a la consulta.
Aquesta columna té dues funcions: l'script la fa servir com a filtre de qualitat (descarta files sense valor en aquesta columna) i, un cop consolidades les dades, et permet filtrar per canal a qualsevol dashboard de Looker Studio.
Pas 2: Obre l'editor d'Apps Script
- Al teu Google Sheet, fes clic al menú superior "Extensions".
- Selecciona "Apps Script".
- S'obrirà una pestanya nova amb l'editor de codi.

Pas 3: Enganxa l'script
- Esborra qualsevol codi que aparegui per defecte a l'editor (normalment una funció buida anomenada myFunction).
- Copia el codi complet que apareix a la secció anterior d'aquest article.
- Enganxa'l a l'editor.
- Fes clic a la icona de desar (disquet) o prem Ctrl+S / Cmd+S.

Pas 4: Executa l'script per primera vegada
- Amb l'script desat, fes clic al botó "Executa" (triangle de reproducció) a la barra superior de l'editor.
- La primera vegada, Google et demanarà que autoritzis l'script perquè pugui accedir al teu full de càlcul. Accepta els permisos.
- Espera uns segons. Quan acabi, veuràs un missatge al registre d'execució a la part inferior de l'editor.
- Torna al teu Google Sheet. Hauries de veure una pestanya nova anomenada "All Ads" amb totes les dades combinades.

Pas 5 (opcional): Programar l'execució automàtica
Si vols que l'script s'executi automàticament, per exemple, cada matí per tenir actualitzades les dades del dia anterior, pots configurar un activador temporal des del mateix editor d'Apps Script:
- A l'editor d'Apps Script, fes clic a la icona del rellotge al tauler lateral esquerre ("Activadors").
- Fes clic a "Afegeix un activador" a la cantonada inferior dreta.
- Selecciona la funció
combinarFilas, el tipus d'activador "Basat en el temps" i la freqüència que necessitis (cada dia, cada hora, etc.). - Desa l'activador. A partir d'aquell moment l'script s'executarà automàticament.
Per què això és rellevant per a un Growth o Demand Gen Manager
Aquest script resol directament les tres friccions descrites al començament de l'article:
- Una única font de veritat: en lloc de tenir una pestanya per a Google i una altra per a Meta, tens un sol full amb totes les dades en el mateix format. Qualsevol anàlisi que facis, per canal, per data, per campanya, parteix del mateix origen.
- Informes unificats des del primer moment: pots connectar el full consolidat a Looker Studio i construir un únic informe amb mètriques agregades de tots dos canals, sense duplicar gràfics ni fer càlculs manuals.
- Càrrega instantània a Looker Studio: en llegir des de Google Sheets en lloc de cridar les APIs de Google Ads i Meta en temps real, els informes carreguen de manera immediata i sense errors intermitents. Google Sheets actua com a memòria cau de les dades.
- Flexibilitat sense ampliar la llicència del connector: si fas servir Dataslayer, Supermetrics o un altre connector en el pla bàsic, aquest script et permet consolidar i estructurar les dades a la teva mida sense necessitar funcionalitats avançades de pagament.
- Normalització automàtica dels noms de campanya: els noms en majúscules garanteixen que les mateixes campanyes sempre s'agrupin correctament, independentment de com es van crear a cada plataforma.
La diferència entre un informe que triga 30 segons a carregar i un que carrega en 2 segons no és un detall tècnic. És la diferència entre un informe que es fa servir i un que s'evita.
Conclusió
El reporting multicanal no hauria de ser un problema d'infraestructura. Si tens les dades a Google Sheets, tens tot el que necessites per construir una vista consolidada que carregui ràpid, que no falli i que puguis personalitzar a la teva mida.
Aquest script no substitueix el teu connector de dades, continuaràs necessitant Dataslayer o una eina semblant per portar les dades de cada plataforma. El que fa és eliminar la fricció que ve després: els informes fragmentats per canal, els temps de càrrega elevats a Looker Studio i la dependència de funcionalitats avançades que no sempre necessites. Amb 40 línies de codi i una configuració inicial de menys d'una hora, tens un sistema de reporting que funciona.
Descarrega l'script a GitHub
Accedeix al repositori de GitHub amb el codi complet, llest per copiar i enganxar al teu Google Sheet. Sense registre, sense cost, sense condicions.
github.com/ferrerponsetiSi vols portar aquesta automatització més lluny, integrant dades de més canals, connectant el full a un dashboard de Looker Studio, o construint un sistema de reporting a mida, pots reservar una sessió de consultoria amb mi al formulari que tens a l'article o em pots escriure a pau@ferrerponseti.com
