Tutorial/Inicio rápido con Google Sheets

Tipos de cambio en vivo en Google Sheets

Conecta exchangerate.dev a una función personalizada =FXRATE() con Apps Script, con caché y manejo de errores. Plan gratuito: 10,000 llamadas al mes, sin tarjeta.

ERexchangerate.dev·Jun 29, 2026·5 min de lectura

Para tener tipos de cambio en vivo en Google Sheets, pega una función personalizada de Apps Script que llame a /v1/latest/{base} con tu clave en la cabecera Authorization, y luego escribe =FXRATE("USD","EUR") en cualquier celda. Una clave gratuita cubre 10,000 llamadas al mes, sin tarjeta. La función de abajo guarda en caché diez minutos y controla los dos errores que te vas a encontrar de verdad. Es el input de FX vivo para un modelo o un panel que mantienes en Sheets.

Key points
Una función personalizada te da =FXRATE("USD","JPY") en cualquier celda — sin instalar complementos.
Una llamada a /v1/latest/{base}?symbols={quote} devuelve el par que pides.
Pasa la clave como Authorization: Bearer exr_live_...; CacheService te mantiene dentro de la cuota.
El plan gratuito son 10,000 llamadas al mes a 12 peticiones por minuto, sin tarjeta.
Los tipos son indicativos — para modelos, análisis y visualización, no para liquidar una operación.

Consigue una clave gratuita

Regístrate en exchangerate.dev/signup. Tras confirmar el correo, el panel muestra una clave que empieza por exr_live_. Cópiala: la vas a pegar en Apps Script en un momento. El plan gratuito son 10,000 llamadas al mes, sin tarjeta.

Abre Apps Script desde tu hoja

Abre cualquier hoja de Google. En el menú, haz clic en Extensiones → Apps Script. Se abre una pestaña nueva con una función function myFunction() {} por defecto. Borra su contenido: lo vas a sustituir en el siguiente paso.

Pega la función FXRATE

Sustituye el contenido del editor por esta función. Llama a exchangerate.dev, guarda cada par en caché diez minutos con CacheService y devuelve un marcador legible para los dos errores que puedes encontrarte (401 y 429).

Code.gscopy
// google-sheets: Apps Script Code.gs
// Replace API_KEY with your exchangerate.dev key from /signup

const API_KEY = 'exr_live_replace_with_your_key_here';
const CACHE_TTL = 600; // seconds — FX moves slower than equities; 10 min is plenty

function FXRATE(from, to) {
  from = (from || 'USD').toString().toUpperCase();
  to = (to || 'EUR').toString().toUpperCase();

  const cacheKey = `fx_${from}_${to}`;
  const cache = CacheService.getScriptCache();
  const cached = cache.get(cacheKey);
  if (cached) return Number(cached);

  const url = `https://api.exchangerate.dev/v1/latest/${from}?symbols=${to}`;
  const resp = UrlFetchApp.fetch(url, {
    headers: { Authorization: `Bearer ${API_KEY}` },
    muteHttpExceptions: true,
  });

  const code = resp.getResponseCode();
  if (code === 401) return '#AUTH_ERROR';
  if (code === 429) return '#RATE_LIMIT';
  if (code !== 200) return '#ERROR';

  const data = JSON.parse(resp.getContentText());
  const rate = data.rates && data.rates[to];
  if (rate == null) return '#NO_PAIR'; // unknown currency code
  cache.put(cacheKey, String(rate), CACHE_TTL);
  return Number(rate); // coerce so cells sum and sort
}

Usa =FXRATE() en cualquier celda

De vuelta en la hoja, escribe =FXRATE("USD","EUR") en una celda vacía. Al cabo de un segundo la celda muestra el tipo actual. La misma función vale para cualquier par soportado: cambia los dos códigos de moneda:

Sheets formula · pairscopy
// Euro per US dollar
=FXRATE("USD", "EUR")        // 0.9245

// Japanese yen per US dollar
=FXRATE("USD", "JPY")        // 157.32

// British pound per euro
=FXRATE("EUR", "GBP")        // 0.8531

// Indonesian rupiah per US dollar
=FXRATE("USD", "IDR")        // 16285.0

Por dentro, cada llamada devuelve la base, el par por el que has filtrado y dos campos de frescura — source y market_session — para que sepas siempre cómo de actual es el número:

GET /v1/latest/USD?symbols=JPYcopy
{
  "result": "success",
  "base": "USD",
  "source": "live",
  "market_session": "open",
  "timestamp": "2026-06-29T09:14:02Z",
  "data_updated_at": "2026-06-29T09:14:00Z",
  "rates": { "JPY": 157.32 },
  "sources": { "JPY": "live" },
  "notice": "Indicative rates, not for settlement."
}
¿Lo estás montando con un asistente de IA?
exchangerate.dev publica un servidor MCP y un llms.txt, así que Claude, Cursor o ChatGPT pueden leer el esquema en vivo y escribirte la función. Pídeselo así: «crea una función personalizada de Google Sheets llamada FXRATE que reciba una moneda de origen y una de destino y devuelva el tipo en vivo de exchangerate.dev, con una caché de diez minutos». Ver la guía de MCP.

Actualización y encaje en el plan gratuito

Apps Script no vuelve a ejecutar las funciones personalizadas por temporizador. Para actualizaciones periódicas, añade un activador por tiempo: en el panel izquierdo de Apps Script, haz clic en Activadores → Añadir activador, elige FXRATE, origen Según tiempo, Temporizador por minutos. La caché de diez minutos más una cuota generosa dejan tranquilo hasta a un libro muy usado:

  • 10,000 llamadas al mes, 12 peticiones por minuto, sin tarjeta
  • CacheService devuelve el tipo cacheado durante 10 minutos, así que editar repetidamente no cuesta nada
  • Sube CACHE_TTL si una hoja con muchos pares llega a rozar el tope por minuto
  • Cubre /v1/latest, /v1/convert, /v1/range y /v1/{date}/{base}
CódigoSíntomaSolución
401La celda muestra #AUTH_ERRORLa clave falta o no es válida. Vuelve a copiarla desde tu panel a API_KEY, arriba del todo en Code.gs.
429La celda muestra #RATE_LIMITHas pasado el tope por minuto. La caché suele evitarlo; sube CACHE_TTL, o cambia de plan en /pricing.
La celda muestra #NO_PAIRLa moneda de destino no venía en la respuesta. Comprueba que el código sea una moneda ISO soportada (por ejemplo JPY, no JYP).
La celda se queda en Loading…Apps Script necesita autorización para hacer peticiones externas. Ejecuta la función una vez desde la barra del editor para que salga el aviso, y acéptalo.
Tipos indicativos, no para liquidación
Estos tipos se publican para modelos, análisis y visualización. No son una cotización en firme: no los uses para liquidar una operación ni una transferencia. Cada respuesta lo indica en su campo notice.
ER
exchangerate.dev
Guías de integración para desarrolladores.

Keep reading

TutorialTipos de cambio en vivo en Excel con Power QueryRead TutorialConversión de divisas en JavaScript y Node.jsRead TutorialCómo obtener tipos de cambio en PythonRead
Más ComparacionesFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
AprenderReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Tasas en VivoEUR/USDGBP/USDUSD/JPY