-
-
Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
| /* | |
| * @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."); | |
| } |
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(); } }Maravilha @hugobrilhante ! Só não estou conseguindo puxar o preço do Tesouro Renda+ Aposentadoria Extra 2045. Já tentei colocando das duas formas: =TESOURODIRETO("Tesouro Renda+ 2045") =TESOURODIRETO("Tesouro Renda+ Aposentadoria Extra 2045")
Tem alguma solução? Muito obrigado!
Essa função pega a coluna da data de vencimento para extrair o ano do título. Na primeira coluna desse arquivo .csv os títulos não tem o ano no nome.
Eu sugiro escrever: =TESOURODIRETO("Tesouro Renda+ Aposentadoria Extra 2064")
Veja se funciona.
Esse título (2045) vence em 2064, por isso acho que deve funcionar.
AVISO A TODOS QUE USAM A MINHA API
O domínio da API foi alterado de tesouro.gabrielgaspar.com.br para tesouro.gabriso.com.
O domínio original continuará funcionando por meio de redirect até 09/09/2026, quando será desativado. Recomendo que todos realizem a atualização antes dessa data.
Obs.: O conteúdo da API não foi alterado.
Pessoal, tudo em boa paz?
Estou com dificuldade para encontrar os dados do dia 30/12/2025.
Nem no gráfico do Tesouro eles listam, aparecendo o valor zerado.
Alguém sabe com recuperar esses dados?
Grato pela cortesia desde já.
Maravilha @hugobrilhante ! Só não estou conseguindo puxar o preço do Tesouro Renda+ Aposentadoria Extra 2045.
Já tentei colocando das duas formas:
=TESOURODIRETO("Tesouro Renda+ 2045")
=TESOURODIRETO("Tesouro Renda+ Aposentadoria Extra 2045")
Tem alguma solução?
Muito obrigado!