Last active
December 8, 2025 04:18
-
-
Save danperrout/b27197056fa38d0d669332647ab89d7a to your computer and use it in GitHub Desktop.
API Função TESOURODIRETO Google Sheets
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /* | |
| * @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(); } }
Sensacional, funcionou perfeitamente, muito obrigado @hugobrilhante! e creio que sua solução vai ser duradoura. E pra quem quiser buscar outros valores é só trocar o 5 no "let precoTexto = latestMatch.columns[5].trim();" que voce vai ter outros resultados, o 5 por padrão é o valor de compra, como está comentado " [0]Tipo Titulo, [1]Data Vencimento, [2]Data Base, [5]PU Compra Manha" e acrescento que o 6 é o valor de venda. Não testei, mas creio que 3 e 4 são as taxas de compra e venda, respectivamente, vale o teste para quem quiser.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Criei essa versão que busca só o preço. Demora um pouco por conta do tamanho do arquivo mas funciona.