Skip to content

Instantly share code, notes, and snippets.

@lucashmsilva
Last active January 11, 2024 13:26
Show Gist options
  • Save lucashmsilva/9f4596f2924ac5c1eb0721c2c41dc257 to your computer and use it in GitHub Desktop.
Save lucashmsilva/9f4596f2924ac5c1eb0721c2c41dc257 to your computer and use it in GitHub Desktop.
API para criar a função TESOURODIRETO Google Sheets
/*
* @return Retorna a cotação atual de um título específico do Tesouro Direto Junto com a taxa anual de retorno
* @customfunction
**/
function TESOURODIRETO(bondName) {
let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.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 === bondName)
return [bond.TrsrBd.untrRedVal, bond.TrsrBd.anulInvstmtRate]; // créditos ao @figueiredods por ter encontrado o campo que retorna a taxa correta
}
throw new Error("Not Found");
}
/*
* @return Retorna a cotação atual de um título específico do Tesouro Direto
* @customfunction
**/
function TESOURODIRETO(bondName) {
let srcURL = "https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.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 === bondName)
return bond.TrsrBd.untrRedVal;
}
throw new Error("Not Found");
}
@Tiagoalvesds
Copy link

Olá! aparece assim...

script

@lucashmsilva
Copy link
Author

@Tiagoalvesds apague toda a linha 1 e a linha 18. Daí salve em implantar e depois volte pra planilha e tente usar a função de novo.

@Tiagoalvesds
Copy link

implantei...mas ao pedir para rodar ele apareceu esse erro abaixo.. é normal?
image

@lucashmsilva
Copy link
Author

Certo, mas agora esse erro não é por um erro na função em si, mas sim porque você está usando no local errado.

Para usar a função você deve voltar à planilha e chamar a funciona como uma função padrão. Dessa forma:
image
Igual se faz no Excel. A diferença é que a função foi criada por você.

@Tiagoalvesds
Copy link

Opa! agora foi Lucas. obrigado! Só está aparecendo um número desconhecido de 6,24 e 6,34. vide exemplo abaixo.
image

@lucashmsilva
Copy link
Author

@Tiagoalvesds, da uma olhada nesse segundo script. Ele retorna somente o valor do título que é passado na função. Pode só copiar o código e substituir todo o código que você colocou lá. Vai ficar igual ao código do print que mandei na primeira resposta que mandei pra você.

Esse número que você está vendo ai é a taxa anual do título, além do valor.

@Tiagoalvesds
Copy link

@lucashmsilva , deu certo e funciona perfeitamente! Obrigado! Notei que a cotação puxada é a de resgate, teria como adicionar uma linha e/ou função que puxa a cotação de compra?

@lucashmsilva
Copy link
Author

lucashmsilva commented Feb 25, 2023

@Tiagoalvesds , cara teria que analisar o retorno desses dados no site no TD para descobrir qual campo é a cotação de compra para só então adaptar o código. Hoje em dia não me lembro muito bem, mas não deve ser difícil descobrir o campo. A fonte de dados é essa: json b3

@andretc
Copy link

andretc commented Aug 22, 2023

Fiz uma melhoria pra cachear a response do tesouro pq as vezes dá erro por chamar vezes seguidas :)

var cache = CacheService.getScriptCache();

function TESOURODIRETO(bondName, argumento = "r") {
  var tesouro = getCachedTesouro();

  if (bondName == "tesouro-selic-2027")
      bondName = "Tesouro Selic 2027";

  if (bondName == "tesouro-selic-2029")
    bondName = "Tesouro Selic 2029";

  if (bondName == "tesouro-prefixado-2025")
    bondName = "Tesouro Prefixado 2025";

  if (!tesouro) {
    Logger.log("No cached tesouro info found");
    updateTesouroCache();
  }

  tesouro = getCachedTesouro();

  for (let bond of tesouro.TrsrBdTradgList) {
    console.log(bond);
    let currBondName = bond.TrsrBd.nm;
    if (currBondName.toLowerCase() === bondName.toLowerCase())
      if (argumento == "r")
        return bond.TrsrBd.untrRedVal;
      else
        return bond.TrsrBd.untrInvstmtVal;
  }

  return 0;
}

function getCachedTesouro() {
  var cached = cache.get("tesouro");
  if (cached) {
    try {
      var tesouro = JSON.parse(cached).response;
      return tesouro;
    } catch (e) {
      Logger.log("Error while parsing tesouro from cache");
    }
  }
}

function updateTesouroCache() {
  Logger.log("Updating tesouro cached information");

  var response = UrlFetchApp.fetch("https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json");
  var content = response.getContentText();
  
  try {
    var data = JSON.parse(content);
    
    var cachedTesouro = {};
    cachedTesouro["tesouro"] = JSON.stringify(data)
    cache.putAll(cachedTesouro);

  } catch (e) {
    Logger.log("Error while parsing response from tesouro: " + content);
  }
}

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