Si el scraping con Excel / VBA es la vía «de escritorio», donde un script trae los datos directamente al libro, Google Sheets ofrece algo que Excel no trae de serie: fórmulas de importación integradas. En muchos casos no hace falta escribir ni una línea de código: basta con insertar una función en una celda para que la hoja cargue por sí sola los datos del sitio y los mantenga actualizados.
Y cuando las fórmulas se quedan cortas, acude al rescate Google Apps Script, el análogo en la nube de VBA, escrito en JavaScript. Sabe hacer peticiones HTTP, parsear JSON y ejecutarse con horario programado, y todo eso corre en los servidores de Google, no en su equipo.
En este artículo recorremos ambos niveles: primero las fórmulas para una extracción rápida sin código, después Apps Script para las tareas complejas.
En qué se diferencia Google Sheets de Excel / VBA
La comparación ayuda a elegir la herramienta según la tarea:
| Criterio | Excel / VBA | Google Sheets |
|---|---|---|
| Extraer datos con una fórmula, sin código | Solo Power Query | IMPORTXML, IMPORTHTML, etc. |
| Lenguaje de scripts | VBA | Apps Script (JavaScript) |
| Dónde se ejecuta | En su PC | En la nube de Google |
| Ejecución programada | Programador de tareas de Windows + macro | Activadores de serie |
| Trabajo colaborativo | Compartiendo el archivo | En tiempo real, con un enlace |
| Datos financieros listos | No | GOOGLEFINANCE integrada |
| Límites de peticiones | Prácticamente ninguno | Cuotas de Google |
La conclusión principal: para una extracción ligera o media, Google Sheets suele ser más rápido, porque la mitad de las tareas se resuelven con una sola fórmula. En los escenarios pesados y no estándar, la lógica es la misma que en VBA; lo único que cambia es la sintaxis.
Nivel 1. Extracción con fórmulas
IMPORTHTML — tablas y listas
La función más simple. Extrae una tabla o una lista completa por su número:
=IMPORTHTML("https://example.com/page"; "table"; 1)Argumentos: la URL, el tipo de elemento ("table" o "list") y su número de orden en la página. Si la página contiene varias tablas, vaya probando el índice (1, 2, 3...) hasta dar con la que busca. El resultado se «derrama» automáticamente sobre las celdas contiguas.
IMPORTXML — extracción precisa con XPath
La más potente de las herramientas de fórmula. Recibe una URL y una consulta XPath, la expresión que apunta a un elemento concreto del marcado:
=IMPORTXML("https://example.com"; "//h1")
=IMPORTXML("https://example.com"; "//div[@class='price']")
=IMPORTXML("https://example.com"; "//span[@id='total']/text()")Algunas plantillas XPath útiles:
| Tarea | XPath |
|---|---|
| Todos los encabezados h2 | //h2 |
| Elemento por clase | //div[@class='value'] |
| Elemento por id | //*[@id='price'] |
| Un atributo (por ejemplo, un enlace) | //a/@href |
| El texto dentro de una etiqueta | //span[@class='cur']/text() |
| El enésimo elemento de una lista | (//li)[3] |
La forma más fácil de obtener el XPath es mirarlo en el navegador: abra las herramientas de desarrollo (F12), localice el elemento y haga clic derecho → Copy → Copy XPath.
IMPORTDATA — CSV y TSV
Si la fuente ofrece un archivo CSV o TSV ya listo, lo traemos directamente:
=IMPORTDATA("https://example.com/data.csv")La función reparte los valores por columnas por sí sola. Ideal para datasets abiertos y exportaciones.
IMPORTFEED — RSS y Atom
Para feeds de noticias y blogs:
=IMPORTFEED("https://example.com/rss")GOOGLEFINANCE — finanzas sin scraping alguno
Merece mención aparte GOOGLEFINANCE, la fuente integrada de datos bursátiles y de divisas. Es el caso en el que no hay que scrapear nada: Google ya lo ha recopilado todo por usted.
=GOOGLEFINANCE("NASDAQ:AAPL"; "price")
=GOOGLEFINANCE("CURRENCY:USDEUR")
=GOOGLEFINANCE("NASDAQ:GOOGL"; "price"; DATE(2024;1;1); DATE(2024;12;31); "DAILY")El primer ejemplo es el precio actual de una acción; el segundo, el cambio de un par de divisas; el tercero, las cotizaciones históricas de un periodo. Si su tarea encaja en lo que cubre GOOGLEFINANCE, ese es el camino más fiable: sin bloqueos ni maquetación rota. El scraping de sitios de terceros solo hace falta allí donde esos datos no existen o se necesita una fuente no estándar.
Nivel 2. Google Apps Script
Las fórmulas están bien, pero tienen techo: no saben autenticarse, sortear protecciones complejas, procesar el JSON anidado de una API ni ejecutar lógica con ramificaciones. Ahí es donde empieza Apps Script.
Abra la hoja de cálculo → Extensiones → Apps Script, y entrará en el editor de código en la nube. Es el equivalente directo del editor de VBA del material sobre Excel, solo que en JavaScript.
Petición HTTP: UrlFetchApp
La petición básica a una página o a una API:
function getResponse(url) {
const options = {
method: 'get',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'
},
muteHttpExceptions: true // no fallar con los códigos 4xx/5xx
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
return response.getContentText();
}
return 'ERROR: ' + response.getResponseCode();
}Compárelo con la función GetResponse del artículo sobre VBA: la lógica es idéntica — abrir la petición, poner el User-Agent, comprobar el código de respuesta. Solo cambia el envoltorio: en lugar de MSXML2.XMLHTTP, aquí está UrlFetchApp.
Parseo de JSON: nativo
La gran ventaja de Apps Script sobre VBA: el JSON se parsea con una única instrucción integrada, sin funciones caseras ni módulos de terceros.
function getPrice(symbol) {
const url = 'https://example-api.com/quote?symbol=' + symbol;
const json = getResponse(url);
const data = JSON.parse(json); // una línea en lugar de ExtractJsonValue
return data.price;
}En VBA, para lo mismo, había que analizar la cadena a mano o enchufar VBA-JSON. Aquí basta JSON.parse, y ya trabaja directamente con el objeto.
Escribir el resultado en la hoja
Escribimos los datos en las celdas a través del objeto de la hoja:
function writeQuotes() {
const tickers = ['AAPL', 'MSFT', 'GOOGL', 'TSLA'];
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Encabezados
sheet.getRange(1, 1, 1, 3).setValues([['Ticker', 'Precio', 'Hora']]);
const rows = [];
const now = new Date();
tickers.forEach(function (ticker) {
const price = getPrice(ticker);
rows.push([ticker, price, now]);
Utilities.sleep(1000); // pausa de 1 s entre peticiones
});
// Volcamos todo en una sola llamada: es más rápido
sheet.getRange(2, 1, rows.length, 3).setValues(rows);
}El principio de «acumular en un array y volcar en una sola llamada» es aquí tan importante para la velocidad como en VBA: setValues sobre todo el rango funciona varias veces más rápido que escribir celda a celda dentro de un bucle.
Parseo de HTML en Apps Script
Con el análisis de HTML integrado la cosa se complica: Apps Script no tiene un parser del DOM completo como el HTMLDocument de VBA. En la práctica se usan expresiones regulares o la extracción de texto entre marcadores:
function extractByRegex(text, pattern) {
const re = new RegExp(pattern);
const match = text.match(re);
return match ? match[1] : '';
}
// Ejemplo: sacar el precio de "<span class='price'>152.34</span>"
// const price = extractByRegex(html, "class='price'>([\\d.]+)<");Para marcados complejos a veces se recurre a bibliotecas de terceros (por ejemplo, Cheerio a través de un servicio de envoltorio), pero en la mayoría de las tareas bastan las expresiones regulares o la fórmula XPath IMPORTXML.
Una función personalizada para la celda
Apps Script permite crear una fórmula propia, invocable directamente desde la hoja como si fuera una integrada:
/**
* Devuelve el precio de un ticker.
* @customfunction
*/
function MYPRICE(symbol) {
return getPrice(symbol);
}Tras guardar, en la celda funcionará =MYPRICE("AAPL"). VBA tiene una posibilidad parecida con las UDF, pero aquí la función queda disponible de inmediato para todos los que tengan acceso a la hoja.
Actualización automática programada
En VBA, para ejecuciones periódicas hace falta el programador de tareas externo de Windows. En Google Sheets la programación viene integrada: son los activadores (triggers).
En el editor de Apps Script: icono del reloj (Activadores) → Añadir activador → elija la función, el evento «según tiempo» y el intervalo (cada hora, cada día, etc.).
O por código:
function setupTrigger() {
ScriptApp.newTrigger('writeQuotes')
.timeBased()
.everyHours(1)
.create();
}El script se ejecutará en los servidores de Google incluso con su equipo apagado y la hoja cerrada. Para un scraper en VBA eso es inalcanzable sin una máquina encendida de forma permanente.
Límites y trampas ocultas
El enfoque en la nube tiene su precio: las cuotas de Google.
- Las fórmulas
IMPORT...se actualizan de forma periódica (aproximadamente una vez por hora) y se cachean. No sirven para una actualidad al segundo. UrlFetchApptiene un límite diario de llamadas (depende del tipo de cuenta; normalmente, miles de peticiones al día en la gratuita).- El tiempo de ejecución del script está limitado (del orden de 6 minutos por ejecución en las cuentas gratuitas). Una extracción larga habrá que trocearla.
#N/AyLoading...en las fórmulas suelen significar que la fuente no devolvió datos, cambió la maquetación o bloqueó la petición procedente de los servidores de Google.
Estas restricciones son la razón principal por la que el scraping pesado y frecuente a veces vuelve al carril «de escritorio» del material sobre Excel / VBA, donde, en la práctica, no hay límites de peticiones.
Qué elegir: Sheets o Excel / VBA
Un resumen rápido:
- Rápido y sin código, datos en la hoja, trabajo en equipo → Google Sheets y fórmulas.
- Tipos de cambio y cotizaciones bursátiles → primero
GOOGLEFINANCE, y solo si se queda corta, scraping. - Actualización automática sin el PC encendido → Google Sheets con activadores.
- Gran volumen, peticiones frecuentes, sin límites, parseo de HTML complejo → Excel / VBA.
- Entorno corporativo sin nube, datos locales → Excel / VBA.
Conclusión
Google Sheets cubre dos niveles de extracción de datos con una sola herramienta. Las fórmulas IMPORTHTML, IMPORTXML, IMPORTDATA y GOOGLEFINANCE resuelven las tareas típicas sin una sola línea de código, y Apps Script, con UrlFetchApp y el JSON.parse nativo, se hace cargo de todo lo complejo — y lo hace en la nube, con horario programado y sin depender de su equipo.
En comparación con el enfoque del material sobre Excel / VBA, la lógica sigue siendo la misma — petición, parseo, escritura, manejo de errores —, pero la sintaxis es más simple, el JSON se parsea «de fábrica» y la automatización no exige un programador externo. El precio de la comodidad son las cuotas de Google: cuando choque con ellas, tiene sentido volver a la solución de escritorio en VBA. Las dos herramientas no compiten entre sí, sino que se complementan: elija según la tarea concreta.