Skip to content

Instantly share code, notes, and snippets.

@icarovirtual
Created December 28, 2020 12:52
Show Gist options
  • Save icarovirtual/9c947da2da25011a8e09b050a5f7b066 to your computer and use it in GitHub Desktop.
Save icarovirtual/9c947da2da25011a8e09b050a5f7b066 to your computer and use it in GitHub Desktop.
// Deixar vazio, preencher caso deseje testar uma nota
const CHAVE_FORCADA = ""
// Para substituir múltiplos espaços
const MULTI_ESPACOS_REGEX = /\s{2,}/g;
// Para substituir um espaço
const UNI_ESPACO_REGEX = /\s{1}/g;
/** Pela assinatura da função executa ao abrir a planilha. */
function onOpen() {
SpreadsheetApp.getUi()
.createMenu("Nota Fiscal Eletrônica")
.addItem("Realizar importação na planilha atual", "importarNfe")
.addItem("Processamento manual", "_fallbackNfe")
.addToUi();
}
/** Busca detalhes da nota e apresenta na tabela. */
function importarNfe() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
// Limpa toda área (99 linhas)
sheet.getRange(3, 1, 99, 6).clearContent();
var chaveNfe = sheet.getRange(1 ,2).getValue();
if (CHAVE_FORCADA != "") {
chaveNfe = CHAVE_FORCADA
}
if (chaveNfe == null || chaveNfe == "") {
Logger.log("importarNfe:chaveNfe:error")
SpreadsheetApp.getUi().alert("Chave não informada...")
return;
}
chaveNfe = chaveNfe.replace(UNI_ESPACO_REGEX, "")
Logger.log("importarNfe:chaveNfe:" + chaveNfe)
// Chamada
var formData = {
'chaveNFe': chaveNfe,
'HML': false
}
// POST para o serviço da NFe
var options = {
'method': 'post',
'payload': formData
}
try {
var resultado = UrlFetchApp.fetch('https://www.sefaz.rs.gov.br/ASP/AAE_ROOT/NFE/SAT-WEB-NFE-NFC_2.asp', options)
} catch (e) {
// Pode ocorrer erro de timeout, apenas tenta novamente
Logger.log("importarNfe:fetch:error:" + e)
importarNfe(chaveNfe)
return;
}
// Busca todas as linhas dentro da tabela principal (pelo id)
var regexLinhas = new RegExp('<tr id="Item (?:.|\n)+<\/tr>', "g")
var todasLinhasJuntas = regexLinhas.exec(resultado.getContentText())
if (todasLinhasJuntas == null) {
Logger.log("importarNfe:todasLinhasJuntas:error")
SpreadsheetApp.getUi().alert(Utilities.formatString("Erro ao buscar produtos da nota: %s.", chaveNfe))
return;
}
Logger.log("importarNfe:regexLinhas:" + todasLinhasJuntas.length)
// Quebra cada linha de toda tabela
var sohProdutos = [];
var cadaLinhaSeparada = todasLinhasJuntas[0].split('</tr>')
for (var i = 0; i < cadaLinhaSeparada.length; i++) {
var linhaProduto = cadaLinhaSeparada[i];
// O regex acaba pegando algumas linhas a mais então é possível
// quebrar o loop ao encontrar uma fora do padrão
if (linhaProduto.indexOf("</table>") > -1) {
break;
}
sohProdutos.push(linhaProduto)
}
Logger.log("importarNfe:sohProdutos:" + sohProdutos.length)
// Quebra colunas de cada linha
var linhasDaTabela = [];
for (var j = 0; j < sohProdutos.length; j++) {
var colunasDoProduto = sohProdutos[j].split('</td>')
// Cada coluna
var codigo = colunasDoProduto[0].split(';">')[1]
var nome = _limparEspacos(colunasDoProduto[1].split(';">')[1])
var quantidade = colunasDoProduto[2].split(';">')[1]
var tipo = colunasDoProduto[3].split(';">')[1]
var unitario = colunasDoProduto[4].split(';">')[1]
var total = colunasDoProduto[5].split(';">')[1]
linhasDaTabela.push([codigo, nome, quantidade, tipo, unitario, total])
}
Logger.log("importarNfe:linhasDaTabela:" + linhasDaTabela.length)
// Aplica valores
sheet.getRange(3, 1, linhasDaTabela.length, 6).setValues(linhasDaTabela);
Logger.log("importarNfe:done")
}
/** Apresenta opções de processamento manual. */
function _fallbackNfe() {
var style = "color:#202124; font-family:'Google Sans',Roboto,RobotoDraft,Helvetica,Arial,sans-serif; font-size:18px; font-weight:400; line-height:28px;"
// Serviço para POST
var requisicaoUrl = Utilities.formatString('- <a href="%s" target="blank" onclick="google.script.host.close()" style="%s">%s</a></body></html>',
"https://reqbin.com/isf04fue", style, "Serviço de requisições")
// Site do governo
var manualUrl = Utilities.formatString('- <a href="%s" target="blank" onclick="google.script.host.close()" style="%s">%s</a></body></html>',
"https://www.sefaz.rs.gov.br/ASP/AAE_ROOT/NFE/SAT-WEB-NFE-NFC_1.asp", style, "Consulta manual")
// Conteúdo do popup
var html = Utilities.formatString('<html><body>%s <br><br> %s</body></html>', requisicaoUrl, manualUrl);
SpreadsheetApp.getUi().showModelessDialog(HtmlService.createHtmlOutput(html), "Processamento manual");
}
/** Substitui múltiplos espaços por um só. */
function _limparEspacos(texto) {
return texto.replace(MULTI_ESPACOS_REGEX, " ")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment