Skip to content

Instantly share code, notes, and snippets.

@danperrout
Last active November 22, 2025 03:07
Show Gist options
  • Select an option

  • Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.

Select an option

Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
API Função TESOURODIRETO Google Sheets
/*
* @return Acesse radaropcoes.com Retorna a cotação atual de um título específico do Tesouro Direto.
* API: https://radaropcoes.com/
* Fonte: https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm
**/
function TESOURODIRETO(bondName, argumento="r") {
let srcURL = "https://api.radaropcoes.com/bonds.json";
let jsondata = UrlFetchApp.fetch(srcURL);
let parsedData = JSON.parse(jsondata.getContentText()).response;
for(let bond of parsedData.TrsrBdTradgList) {
let currBondName = bond.TrsrBd.nm;
if (currBondName.toLowerCase() === bondName.toLowerCase())
if(argumento == "r")
return bond.TrsrBd.untrRedVal;
else
return bond.TrsrBd.untrInvstmtVal;
}
throw new Error("Título não encontrado.");
}
@hugobrilhante
Copy link

Criei essa versão que busca só o preço. Demora um pouco por conta do tamanho do arquivo mas funciona.

/**
 * Função auxiliar para converter data DD/MM/AAAA para um formato comparável (AAAA-MM-DD).
 * @param {string} dateString Data no formato DD/MM/AAAA.
 * @return {string} Data no formato AAAA-MM-DD.
 */
function parseDateForComparison(dateString) {
  if (!dateString) return '';
  const parts = dateString.split('/');
  if (parts.length === 3) {
    // Retorna YYYY-MM-DD, que pode ser comparado como string
    return `${parts[2]}-${parts[1]}-${parts[0]}`;
  }
  return '';
}

/**
 * Busca o preço de um título do Tesouro.
 *
 * @param {string} nomeDoTitulo O nome do título a ser buscado (Ex: "Tesouro IPCA+ 2029").
 * @return {number|string} O preço de investimento do título ou uma mensagem de erro.
 * @customfunction
 */
function TESOURODIRETO(nomeDoTitulo) {
  const URL_CSV =
    "https://www.tesourotransparente.gov.br/ckan/dataset/df56aa42-484a-4a59-8184-7676580c81e3/resource/796d2059-14e9-44e3-80c9-2d9e30b405c1/download/precotaxatesourodireto.csv";

  const options = {
    muteHttpExceptions: true
  };

  const termoBuscado = nomeDoTitulo.trim().toLowerCase();

  let latestMatch = null; // Armazenará {dateSortable: string, columns: array}

  try {
    const response = UrlFetchApp.fetch(URL_CSV, options);
    const csvContent = response.getContentText();

    if (response.getResponseCode() !== 200) {
      return "ERRO: Não foi possível baixar o CSV. Código: " + response.getResponseCode();
    }

    const linhas = csvContent.split('\n');

    for (let i = 1; i < linhas.length; i++) {
      const linha = linhas[i];
      if (linha.trim() === "") continue;

      const colunas = linha.split(';');

      if (colunas.length < 8) continue;

      // Colunas: [0]Tipo Titulo, [1]Data Vencimento, [2]Data Base, [5]PU Compra Manha
      const tipoTitulo = colunas[0].trim();
      const dataVencimento = colunas[1].trim();
      const dataBase = colunas[2].trim();

      const anoVencimento = dataVencimento.slice(-4);
      const nomeCompletoNoArquivo = `${tipoTitulo} ${anoVencimento}`.trim().toLowerCase();

      if (nomeCompletoNoArquivo === termoBuscado) {
        const sortableDate = parseDateForComparison(dataBase);

        if (sortableDate) {
          if (!latestMatch || sortableDate > latestMatch.dateSortable) {
            latestMatch = {
              dateSortable: sortableDate,
              columns: colunas
            };
          }
        }
      }
    }

    if (latestMatch) {
      let precoTexto = latestMatch.columns[5].trim();

      // Limpa e converte o preço para número
      precoTexto = precoTexto
        .replace("R$", "")
        .replace(/\./g, "")
        .replace(",", ".")
        .trim();

      return parseFloat(precoTexto);
    }

    return `Título "${nomeDoTitulo}" não encontrado. Verifique o Tipo Título e o Ano de Vencimento.`;

  } catch (e) {
    return "ERRO: " + e.toString();
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment