Dúvidas ou problemas? Poste no GitHub Discussions.

O Google Sheets tem o GOOGLEFINANCE para cotações de câmbio, e para uma conversão rápida ele serve bem. O problema é a fonte: uma combinação de mercado de origem não declarada, que você não consegue inspecionar nem escolher. O Frankfurter combina cotações de bancos centrais que você pode inspecionar e, quando a fonte precisa ser exata, você pode fixar uma única autoridade: a taxa de referência do BCE para o IVA da UE, o NBP da Polônia ou a PTAX do Brasil. O histórico de um provedor fixado fica exatamente como foi publicado. As fórmulas abaixo entram onde você colocaria o GOOGLEFINANCE.

Início rápido

Sem configuração e sem chave de API. Coloque uma cotação atual numa célula com IMPORTDATA e o endpoint CSV:

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

O Sheets preenche uma pequena tabela date,base,quote,rate. A coluna date chega como número de série. Selecione a coluna e escolha Formatar, Número, Data para ver as datas. Peça várias moedas de cotação de uma vez, separadas por vírgula:

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

Converter um valor

IMPORTDATA retorna a cotação, não o total convertido. Multiplique o valor pela célula da cotação importada ou use a função personalizada abaixo para resolver tudo numa chamada só.

Função personalizada

Para ter uma função =FRANKFURTER() reutilizável, adicione um pequeno Apps Script. Na planilha, abra Extensões, Apps Script, cole este código e salve:

/**
 * Converte um valor entre moedas, pela cotação de hoje ou de uma data.
 * @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;
}

Depois, use em qualquer célula:

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

Passe uma data para obter uma cotação histórica:

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

Fixar uma fonte oficial

Por padrão, você recebe a combinação de todas as fontes. Adicione providers para fixar uma única autoridade. Isso importa para impostos e contabilidade: muitos países exigem a taxa publicada pelo próprio banco central na conversão de valores em moeda estrangeira.

=IMPORTDATA("https://api.frankfurter.dev/v2/rates.csv?base=usd&quotes=eur&providers=ecb")
ECB
Taxa de referência do Banco Central Europeu, o padrão para IVA e alfândega na UE.
NBP
Narodowy Bank Polski. Na Polônia, o IVA e o imposto de renda das empresas (CIT) são convertidos pela taxa do NBP.
CNB
Fixing do Banco Nacional Tcheco, usado na contabilidade e nos impostos da República Tcheca.
BCB
PTAX do Banco Central do Brasil, a referência para contratos e tributos no Brasil.
BANXICO
Taxa FIX do Banco de México, usada para liquidar obrigações em dólar americano.

Veja todas as fontes. Uma fonte fixada segue o próprio calendário de publicação, então a cotação mais recente dela pode ficar um dia atrás da cotação combinada mais recente.

Séries históricas

Use from para um intervalo de datas e group=month para condensar tudo em uma linha por mês, pronto para virar gráfico. O histórico combinado pode mudar um pouco quando chegam dados novos, então fixe um provedor quando os valores não puderem mudar.

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

Isso traz o dólar americano contra a libra desde 1949, direto do arquivo do Deutsche Bundesbank. Dá para ver a paridade fixa da libra em US$ 2,80 ficar estável por anos até ser rompida em 1967. O histórico mais antigo vem dos fixings do Bundesbank em Frankfurt: o dólar contra o marco desde 1948 e a maioria dos outros pares com o dólar de 1949 a 1970. O Banco Central Europeu assume a partir de 1999, então uma série moderna contínua usa a combinação padrão ou providers=ecb.