Google Search Console permite exportar un informe directamente a Google Sheets, pero esa exportación es una fotografía del momento: no se actualiza sola. Si necesitas mantener un histórico, preparar un tablero SEO o revisar cada semana las mismas dimensiones, repetir la descarga manual termina siendo lento y propenso a errores.
La alternativa es conectar Google Search Console con Google Sheets mediante la API oficial y Google Apps Script. La hoja ejecuta un script autorizado por tu cuenta, consulta los datos de la propiedad y escribe las filas en una pestaña. Después puedes ejecutarlo manualmente o programarlo para que se actualice de forma periódica.
En esta guía construirás una conexión que:
- usa la API oficial de Search Console;
- no requiere un plugin de WordPress ni un conector de pago;
- extrae fecha, consulta, página, dispositivo y país;
- conserva clics, impresiones, CTR y posición media;
- pagina los resultados cuando existen más de 25.000 filas;
- evita duplicar periodos ya importados;
- puede ejecutarse automáticamente una vez por semana;
- deja visibles sus límites para que no confundas una extracción con el total absoluto de la propiedad.
Qué significa realmente “conectar” Search Console con Sheets
Existen tres flujos distintos que suelen llamarse conexión:
- Exportación manual: en Search Console pulsas
Exportar → Google Sheets. Es sencilla, pero crea una hoja estática. - Conector de terceros: una extensión o plataforma consulta la API por ti. Puede ahorrar configuración, aunque añade un proveedor, permisos y, a menudo, un coste.
- Conexión propia con Apps Script: un script dentro de la hoja llama a la API de Search Console con tu autorización.
Aquí utilizaremos el tercer método. No es una sincronización en tiempo real. Search Console procesa sus datos con retraso y el script solo actualiza la hoja cuando se ejecuta. “Automática” significa que una tarea programada repite la consulta con la frecuencia definida.
Si solo quieres analizar una exportación puntual con ChatGPT, utiliza la guía Cómo analizar Google Search Console con ChatGPT paso a paso. La conexión de este artículo tiene sentido cuando necesitas repetir el proceso o conservar un histórico propio.
Requisitos antes de comenzar
Necesitas:
- una cuenta de Google con acceso a la propiedad de Search Console;
- una hoja de cálculo de Google que puedas editar;
- permiso para crear y ejecutar un proyecto de Apps Script;
- acceso a Google Cloud para habilitar la API, si tu organización no lo restringe;
- la identificación exacta de la propiedad.
La propiedad puede tener uno de estos formatos:
- propiedad de dominio:
sc-domain:ejemplo.com; - propiedad con prefijo de URL:
https://www.ejemplo.com/.
El valor debe coincidir con el registrado en Search Console. No intercambies http y https, no elimines la barra final de una propiedad de prefijo y no escribas www si la propiedad utiliza otro host.
Si trabajas con una cuenta corporativa, un administrador puede bloquear APIs, proyectos de Cloud o autorizaciones. En ese caso, no intentes eludir la política: solicita la habilitación correspondiente.
Paso 1: crea la hoja y abre Apps Script
- Crea una hoja de cálculo nueva.
- Ponle un nombre reconocible, por ejemplo
Histórico GSC. - Abre
Extensiones → Apps Script. - Cambia el nombre del proyecto por
Conexión GSC Sheets. - Conserva abierta la pestaña del editor.
El proyecto queda vinculado a esa hoja. Cuando el script utilice SpreadsheetApp.getActiveSpreadsheet(), escribirá en el archivo desde el que abriste Apps Script.
Paso 2: vincula un proyecto de Google Cloud
Apps Script crea inicialmente un proyecto de Cloud administrado por Google. Para habilitar y controlar la API de Search Console, utiliza un proyecto estándar de Google Cloud:
- Entra en Google Cloud Console.
- Crea un proyecto o selecciona uno destinado a esta conexión.
- Copia su número de proyecto.
- Vuelve a Apps Script y abre
Configuración del proyecto. - En la sección de proyecto de Google Cloud, elige cambiar proyecto.
- Introduce el número y confirma.
La interfaz puede variar. Si no aparece la opción o no tienes permisos, revisa si la cuenta pertenece a una organización administrada.
Paso 3: habilita la API de Search Console
Dentro del proyecto de Google Cloud:
- abre
APIs y servicios → Biblioteca; - busca Google Search Console API;
- entra en la ficha correcta;
- pulsa
Habilitar.
No necesitas crear una clave API. El script utilizará un token OAuth de la cuenta que lo ejecuta. Esa cuenta debe tener acceso a la propiedad consultada.
Paso 4: declara los permisos mínimos
En Apps Script, abre Configuración del proyecto y activa la opción para mostrar el archivo de manifiesto appsscript.json en el editor. Sustituye su contenido por este bloque, conservando la zona horaria que corresponda a tu proyecto:
{
"timeZone": "America/Santiago",
"dependencies": {},
"exceptionLogging": "STACKDRIVER",
"runtimeVersion": "V8",
"oauthScopes": [
"https://www.googleapis.com/auth/webmasters.readonly",
"https://www.googleapis.com/auth/spreadsheets.currentonly",
"https://www.googleapis.com/auth/script.external_request"
]
}Los permisos cumplen tres funciones:
- leer datos de Search Console;
- editar únicamente la hoja vinculada al script;
- realizar la solicitud HTTPS a la API.
Revisa siempre la pantalla de consentimiento antes de aceptar. El script será visible dentro de tu propia hoja; no pegues código que no hayas inspeccionado.
Paso 5: pega el script de conexión
Abre Code.gs, elimina el ejemplo inicial y pega el siguiente código:
const GSC_CONFIG = {
property: 'sc-domain:ejemplo.com',
sheetName: 'GSC_Datos',
searchType: 'web',
daysToImport: 28,
dataDelayDays: 3,
dimensions: ['date', 'query', 'page', 'device', 'country'],
rowLimit: 25000
};
function importarGSC() {
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
const sheet = obtenerOCrearHoja_(spreadsheet, GSC_CONFIG.sheetName);
const range = calcularPeriodo_();
const rows = consultarSearchConsole_(range.startDate, range.endDate);
escribirSinDuplicados_(sheet, rows);
sheet.autoResizeColumns(1, 9);
console.log(
`Importación terminada: ${rows.length} filas entre ` +
`${range.startDate} y ${range.endDate}`
);
}
function consultarSearchConsole_(startDate, endDate) {
const endpoint =
'https://www.googleapis.com/webmasters/v3/sites/' +
encodeURIComponent(GSC_CONFIG.property) +
'/searchAnalytics/query';
const allRows = [];
let startRow = 0;
while (true) {
const requestBody = {
startDate: startDate,
endDate: endDate,
dimensions: GSC_CONFIG.dimensions,
type: GSC_CONFIG.searchType,
dataState: 'final',
rowLimit: GSC_CONFIG.rowLimit,
startRow: startRow
};
const response = UrlFetchApp.fetch(endpoint, {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + ScriptApp.getOAuthToken()
},
payload: JSON.stringify(requestBody),
muteHttpExceptions: true
});
const status = response.getResponseCode();
const body = JSON.parse(response.getContentText() || '{}');
if (status < 200 || status >= 300) {
throw new Error(
`Search Console API respondió ${status}: ` +
JSON.stringify(body)
);
}
const pageRows = body.rows || [];
allRows.push(...pageRows);
if (pageRows.length < GSC_CONFIG.rowLimit) break;
startRow += GSC_CONFIG.rowLimit;
}
return allRows;
}
function escribirSinDuplicados_(sheet, apiRows) {
const headers = [
'Fecha', 'Consulta', 'Página', 'Dispositivo', 'País',
'Clics', 'Impresiones', 'CTR', 'Posición'
];
if (sheet.getLastRow() === 0) {
sheet.getRange(1, 1, 1, headers.length).setValues([headers]);
sheet.setFrozenRows(1);
}
const existingKeys = new Set();
const lastRow = sheet.getLastRow();
if (lastRow > 1) {
const existing = sheet
.getRange(2, 1, lastRow - 1, 5)
.getDisplayValues();
existing.forEach(row => existingKeys.add(row.join('¦')));
}
const output = apiRows
.map(row => {
const keys = row.keys || [];
return [
keys[0] || '',
keys[1] || '',
keys[2] || '',
keys[3] || '',
keys[4] || '',
row.clicks || 0,
row.impressions || 0,
row.ctr || 0,
row.position || 0
];
})
.filter(row => {
const key = row.slice(0, 5).join('¦');
if (existingKeys.has(key)) return false;
existingKeys.add(key);
return true;
});
if (output.length === 0) return;
sheet
.getRange(sheet.getLastRow() + 1, 1, output.length, headers.length)
.setValues(output);
sheet
.getRange(2, 8, sheet.getLastRow() - 1, 1)
.setNumberFormat('0.00%');
}
function calcularPeriodo_() {
const end = new Date();
end.setDate(end.getDate() - GSC_CONFIG.dataDelayDays);
const start = new Date(end);
start.setDate(start.getDate() - GSC_CONFIG.daysToImport + 1);
return {
startDate: formatearFecha_(start),
endDate: formatearFecha_(end)
};
}
function formatearFecha_(date) {
return Utilities.formatDate(
date,
Session.getScriptTimeZone(),
'yyyy-MM-dd'
);
}
function obtenerOCrearHoja_(spreadsheet, name) {
return spreadsheet.getSheetByName(name) || spreadsheet.insertSheet(name);
}Antes de ejecutar, cambia:
property: 'sc-domain:ejemplo.com'por tu propiedad exacta. Para una propiedad con prefijo usarías, por ejemplo:
property: 'https://www.ejemplo.com/'
Paso 6: ejecuta y autoriza la conexión
- Guarda el proyecto.
- En el selector de funciones elige
importarGSC. - Pulsa
Ejecutar. - Selecciona la cuenta correcta.
- Revisa los permisos solicitados y autoriza.
- Regresa a la hoja y comprueba la pestaña
GSC_Datos.
La primera fila contiene los encabezados. Cada fila posterior representa una combinación de las dimensiones solicitadas para una fecha: consulta, página, dispositivo y país.
Si el script termina sin escribir datos, abre Ejecuciones en Apps Script. Allí podrás ver si la API devolvió un error o si la consulta no tenía filas para el periodo.
Paso 7: valida que la extracción sea coherente
No des por correcta una conexión solo porque aparecieron filas. Comprueba:
- que las fechas cubren el periodo esperado;
- que la propiedad es la correcta;
- que las URLs pertenecen al sitio;
- que el tipo de búsqueda es
websi eso querías estudiar; - que el CTR está formateado como porcentaje;
- que una segunda ejecución no duplica las mismas combinaciones;
- que las métricas no se interpretan como totales absolutos sin revisar las limitaciones de la API.
La API de Search Analytics devuelve las filas principales y no garantiza entregar todas las combinaciones posibles. Google también puede omitir consultas por privacidad. Por eso, sumar la columna de consultas no siempre reproduce el total que ves en la interfaz.
Las posiciones son promedios de las impresiones incluidas. Si necesitas resumir varias filas, no calcules el promedio simple de la columna Posición; utiliza un promedio ponderado por impresiones.
Paso 8: programa una actualización semanal
Cuando la ejecución manual funcione:
- abre
Activadoresen la barra lateral de Apps Script; - pulsa
Añadir activador; - elige la función
importarGSC; - selecciona
Basado en tiempo; - elige
Temporizador semanal; - selecciona el día y la franja horaria;
- guarda.
Los activadores instalables se ejecutan con la autorización de la cuenta que los creó. Si esa cuenta pierde acceso a la propiedad, la automatización fallará aunque la hoja siga existiendo.
Una frecuencia semanal suele ser suficiente para análisis editorial. Ejecutar el proceso cada hora no elimina el retraso de Search Console y aumenta consumo de cuotas sin aportar necesariamente mejores decisiones.

Cómo adaptar la consulta sin romper el histórico
Cambiar el periodo
Modifica daysToImport. Por ejemplo, 7 recupera una ventana de siete días y 90 una de noventa. El script deja un margen de tres días mediante dataDelayDays para consultar datos finales en lugar de datos recientes todavía parciales.
Extraer solo páginas y fechas
Cambia:
dimensions: ['date', 'query', 'page', 'device', 'country']por:
dimensions: ['date', 'page']Si cambias dimensiones, crea otra pestaña o ajusta también los encabezados y el mapeo. No mezcles estructuras distintas en la misma tabla.
Consultar imagen, vídeo o noticias
Modifica searchType solo si tu propiedad tiene datos para ese tipo. La disponibilidad y los valores admitidos dependen de la API. Para un histórico editorial general, web es el punto de partida normal.
Crear tablas separadas
Para análisis más limpios, puedes mantener consultas independientes:
GSC_Paginas: fecha + página;GSC_Consultas: fecha + consulta;GSC_Dispositivos: fecha + dispositivo;GSC_Paises: fecha + país.
Esto reduce combinaciones, facilita la validación y evita utilizar una tabla granular para reconstruir totales que pertenecen a otra agregación.
Errores frecuentes y cómo solucionarlos

Error 403: acceso insuficiente
Comprueba tres cosas:
- la cuenta que ejecuta el script tiene acceso a Search Console;
- la propiedad escrita en
GSC_CONFIG.propertycoincide exactamente; - la API de Search Console está habilitada en el proyecto de Cloud vinculado.
Tener acceso a Google Analytics no concede automáticamente acceso a Search Console.
Error 401: credenciales no válidas
Vuelve a ejecutar manualmente la función y revisa la autorización. Si modificaste los oauthScopes, Apps Script puede necesitar un nuevo consentimiento.
Error 404: propiedad desconocida
Suele indicar que el formato de la propiedad es incorrecto. Revisa sc-domain:, protocolo, host y barra final. También confirma que la cuenta autorizada puede ver esa propiedad.
La hoja queda vacía
Prueba un periodo más amplio y confirma que la propiedad tiene impresiones. Abre el registro de ejecución para distinguir una respuesta sin filas de un fallo silencioso.
Aparecen menos datos que en Search Console
No presupongas que faltó una página del script. Search Analytics prioriza filas principales, aplica límites internos y puede ocultar consultas por privacidad. La API no promete devolver todas las filas existentes.
Se duplican filas
Este ejemplo usa una clave compuesta por las cinco dimensiones. Si cambias las dimensiones sin adaptar escribirSinDuplicados_, la clave dejará de representar correctamente cada fila. Mantén alineados dimensiones, encabezados y clave.
El activador dejó de funcionar
Revisa Ejecuciones, permisos y acceso a la propiedad. Los activadores pertenecen a quien los crea; un cambio de cuenta, contraseña corporativa, política o permisos puede exigir una nueva autorización.
Se supera el tiempo máximo de ejecución
Reduce el periodo o consulta menos dimensiones. También puedes separar el proceso por fechas y guardar el último día importado. Una tabla con cinco dimensiones puede crecer mucho más rápido que una tabla de páginas.
Límites que debes conocer
rowLimitadmite hasta 25.000 filas por solicitud; para continuar se utilizastartRow.- La API mantiene límites internos y devuelve las filas principales, no un conjunto exhaustivo garantizado.
- Google documenta un límite de 50.000 filas diarias por tipo de búsqueda en determinadas extracciones de Search Analytics.
- Apps Script tiene cuotas y tiempos máximos de ejecución propios.
- Los datos recientes pueden estar incompletos; esta guía solicita
dataState: 'final'y deja tres días de margen. - Una hoja con millones de celdas dejará de ser una base cómoda; para volúmenes grandes conviene estudiar BigQuery u otra arquitectura.
La conexión sirve para análisis recurrentes de tamaño pequeño o medio. No debe presentarse como un almacén ilimitado ni como réplica perfecta de la interfaz.
Checklist final
Una conexión útil empieza por una pregunta concreta
Automatizar datos no sustituye el análisis. Antes de crear gráficos o reglas, define qué decisión quieres tomar: detectar páginas que ganan visibilidad, comparar consultas, observar CTR o medir una actualización reciente.
La conexión correcta es la que conserva datos suficientes, utiliza la agregación adecuada y deja claro qué no puede demostrar. Una hoja enorme sin propósito solo traslada el desorden desde Search Console.
Cuando el histórico esté funcionando, puedes usarlo como entrada para el proceso explicado en Cómo analizar Google Search Console con ChatGPT paso a paso: validar archivos, comparar periodos equivalentes, separar hechos de hipótesis y seleccionar una sola intervención SEO.
Fuentes oficiales
- Search Console API: referencia general
- Search Analytics: método query
- Consultar datos de Search Analytics
- Obtener todos los datos disponibles y paginar resultados
- Descripción general de Google Apps Script
- Extender Google Sheets con Apps Script
- Activadores instalables y temporizados
- Cuotas de Google Apps Script



