¿Dudas o problemas? Escribe en GitHub Discussions.

Google Sheets tiene GOOGLEFINANCE para los tipos de cambio y, para una conversión rápida, sirve. El problema es la fuente: un tipo de mercado combinado anónimo que no puedes inspeccionar ni elegir. Frankfurter combina tipos de bancos centrales que sí puedes inspeccionar y, cuando la fuente tiene que ser exacta, te deja fijar una sola institución: el tipo de referencia del BCE para el IVA en la UE, el NBP de Polonia o el PTAX de Brasil. El histórico de un proveedor fijado se queda tal como se publicó. Las fórmulas de abajo van donde pondrías GOOGLEFINANCE.

Inicio rápido

Sin configuración ni clave API. Pon un tipo en tiempo real en una celda con IMPORTDATA y el endpoint CSV:

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur")

Sheets rellena una pequeña tabla date,base,quote,rate. La columna date llega como número de serie. Selecciónala y elige Formato, Número, Fecha para verla como fecha. Pide varias divisas a la vez separándolas con comas:

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur,gbp,jpy")

Convertir un importe

IMPORTDATA devuelve el tipo, no el total convertido. Multiplica tu importe por la celda con el tipo importado o usa la función personalizada de abajo para hacerlo en una sola llamada.

Función personalizada

Para tener una función =FRANKFURTER() reutilizable, añade un pequeño Apps Script. En tu hoja, abre Extensiones, Apps Script, pega esto y guarda:

/**
 * Convierte un importe entre divisas, al tipo de hoy o al de una fecha.
 * @customfunction
 */
function FRANKFURTER(amount, from, to, date) {
  let url = `https://api.frankfurter.dev/v2/rate/${from}/${to}`;
  if (date) {
    const tz = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
    url += `?date=${Utilities.formatDate(date, tz, "yyyy-MM-dd")}`;
  }
  const data = JSON.parse(UrlFetchApp.fetch(url).getContentText());
  return amount * data.rate;
}

Luego llámala desde cualquier celda:

=FRANKFURTER(100, "usd", "eur")

Pasa una fecha para obtener un tipo histórico:

=FRANKFURTER(100, "usd", "eur", DATE(2020, 1, 2))

Fijar una fuente oficial

Por defecto obtienes el tipo combinado de todas las fuentes. Añade providers para fijar una sola institución. Esto importa en impuestos y contabilidad: muchos países exigen el tipo publicado por su propio banco central para convertir importes en moneda extranjera.

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur&providers=ecb")
ECB
Tipo de referencia del Banco Central Europeo, el estándar para IVA y aduanas en la UE.
NBP
Narodowy Bank Polski. En Polonia, el IVA y el impuesto sobre sociedades se convierten al tipo del NBP.
CNB
Fixing del Banco Nacional Checo, usado en la contabilidad y los impuestos checos.
BCB
PTAX del Banco Central do Brasil, la referencia para contratos e impuestos en Brasil.
BANXICO
Tipo FIX del Banco de México para liquidar obligaciones en dólares estadounidenses.

Consulta todas las fuentes. Una fuente fijada sigue su propio calendario de publicación, así que su último tipo puede ir un día por detrás del último tipo combinado.

Series históricas

Usa from para un rango de fechas y group=month para reducirlo a una fila por mes, listo para un gráfico. El histórico combinado puede moverse un poco cuando llegan datos nuevos, así que fija un proveedor cuando las cifras no deban cambiar.

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?from=1949-12-01&base=usd&quotes=gbp&providers=bbk&group=month")

Esto trae el dólar estadounidense frente a la libra desde 1949, del archivo del Deutsche Bundesbank. Verás cómo la paridad de 2,80 dólares por libra se mantiene fija durante años y se rompe en 1967. El histórico más antiguo sale de los fixings de Fráncfort del Bundesbank: el dólar frente al marco desde 1948 y la mayoría de los demás cruces con el dólar de 1949 a 1970. A partir de 1999 toma el relevo el Banco Central Europeo, así que para una serie moderna continua usa el tipo combinado por defecto o providers=ecb.