Scraping por lenguaje 7 min de lectura

Extracción de datos web en Google Sheets: fórmulas IMPORT y Apps Script

Extraiga datos web directamente en Google Sheets: IMPORTXML, IMPORTHTML y Apps Script, con los límites de las fórmulas y qué hacer cuando se quedan cortas.

EW
Equipo Web-Scraping.es
Recopilación de datos para las necesidades del negocio
Publicado: 12 marzo 2025

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:

code
=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:

code
=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:

code
=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:

code
=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.

code
=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:

javascript
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.

javascript
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:

javascript
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:

javascript
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:

javascript
/**
 * 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:

javascript
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.
  • UrlFetchApp tiene 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/A y Loading... 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 complejoExcel / 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.