Created
December 28, 2020 12:52
-
-
Save icarovirtual/9c947da2da25011a8e09b050a5f7b066 to your computer and use it in GitHub Desktop.
This file contains 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
// 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