Uma solução inovadora para a gestão financeira
O cliente Azevedo enfrentava dificuldades com um modelo de orçamento antiquado e pouco funcional. Reconhecendo a necessidade de modernização, desenvolvemos um modelo no Google Sheets que não só atende às expectativas estéticas com uma interface limpa, mas também incorpora funcionalidades avançadas para otimizar o processo de orçamento.
Interface Intuitiva e Campos Personalizáveis: O novo modelo destaca-se pela sua simplicidade visual e facilidade de uso. Os campos para inserção do nome do cliente, contato, número da proposta e data são claros e acessíveis, garantindo que as informações mais importantes estejam sempre à frente e no centro.
Detalhamento de Serviços e Custos Adicionais: Abaixo dos campos principais, o modelo oferece espaço para descrever os serviços oferecidos e quaisquer serviços adicionais que possam ser necessários. Isso permite uma transparência completa e uma comunicação eficaz com o cliente sobre o que está sendo oferecido.

Automatizações que Impulsionam a Eficiência: O modelo não é apenas visualmente agradável, mas também altamente funcional graças às seguintes automações:
1. Salvamento Automático de Dados: Ao clicar no botão “Salvar Orçamento”, todos os dados são automaticamente salvos na guia “Banco de Dados”, garantindo que nenhuma informação seja perdida.
function salvarorcamento() {
/*de onde vem*/
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guiamenu = planilha.getSheetByName("Principal");
var guiadados = planilha.getSheetByName("Banco");
/*Dados planilha principal*/
var cliente = guiamenu.getRange("C4");
var clienteendereco = guiamenu.getRange("C5");
var clientecontato = guiamenu.getRange("C6");
var orcanota = guiamenu.getRange("H4");
var orcadata = guiamenu.getRange("H5");
var pedidos = guiamenu.getRange("B9:H23");
/*processamento*/
var pedidosValores = pedidos.getValues();
var pedidosString = pedidosValores.map(function(valor) {
return valor + "\n";
}).join("");
/**/
var pedidosextras = guiamenu.getRange("B25:H31");
/*processamento*/
var pedidosextrasValores = pedidosextras.getValues();
var pedidosextrasString = pedidosextrasValores.map(function(valor) {
return valor + "\n";
}).join("");
/**/
var subtotal = guiamenu.getRange("H33");
var taxaaplicada = guiamenu.getRange("H34");
var total = guiamenu.getRange("H37");
if (
cliente.getValue() == "" ||
orcadata.getValue() == "" ||
clienteendereco.getValue() == "" ||
clientecontato.getValue() == "" ||
orcanota.getValue() == "" ||
subtotal.getValue() == "" ||
total.getValue() == ""
) {
Browser.msgBox("Atenção, existem campos vazios");
} else {
/*Salvar os dados*/
var linha = guiadados.getLastRow()+1;
var colarorcanota = "B" + linha;
var colarorcadata = "C" + linha;
var colarcliente = "D" + linha;
var colarclienteendereco = "E" + linha;
var colarclientecontato = "F" + linha;
var colarpedidos = "G" + linha;
var colarpedidosextras = "H" + linha;
var colarsubtotal = "I" + linha;
var colartaxaaplicada = "J" + linha;
var colartotal = "K" + linha;
/* Incluir ID*/
var maiorid = Math.max.apply(null,guiadados.getRange("A2:A").getValues());
var id = maiorid + 1;
var linha = guiadados.getLastRow();
var linha = linha + 1;
guiadados.getRange(linha, 1).setValue(id);
/*fim*/
orcanota.copyTo(guiadados.getRange(colarorcanota),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
orcadata.copyTo(guiadados.getRange(colarorcadata),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
cliente.copyTo(guiadados.getRange(colarcliente),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
clienteendereco.copyTo(guiadados.getRange(colarclienteendereco),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
clientecontato.copyTo(guiadados.getRange(colarclientecontato),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
var celulaDestino = guiadados.getRange(colarpedidos);
celulaDestino.setValue(pedidosString);
var celulaDestino = guiadados.getRange(colarpedidosextras);
celulaDestino.setValue(pedidosextrasString);
subtotal.copyTo(guiadados.getRange(colarsubtotal),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
taxaaplicada.copyTo(guiadados.getRange(colartaxaaplicada),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
total.copyTo(guiadados.getRange(colartotal),SpreadsheetApp.CopyPasteType.PASTE_VALUES,false);
/*Levar o curso para a.*/
guiamenu.getRange("C4").activate();
Browser.msgBox("Orçamento salvo com sucesso");
}
}
2. Geração de ID de Proposta: O campo de proposta verifica automaticamente o último ID na tabela “Banco de Dados” e gera um novo código seguindo o formato (data/último ID + 1).
function Id() {
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guiadados = planilha.getSheetByName("Banco");
var maiorid = Math.max.apply(null,guiadados.getRange("A2:A").getValues());
var id = maiorid + 1;
var linha = guiadados.getLastRow();
var linha = linha + 1;
guiadados.getRange(linha, 1).setValue(id);
}
function numnota() {
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guiadados = planilha.getSheetByName("Banco");
var guiamenu = planilha.getSheetByName("Principal");
var ultimoNumero = Math.max.apply(null,guiadados.getRange("A2:A").getValues());
var ultimoNumero = ultimoNumero +1;
var datalimpa = Utilities.formatDate(new Date(), "GMT", "yyyyMMdd");
var numeroNota = datalimpa + "/" + ultimoNumero;
guiamenu.getRange("H4").setValue(numeroNota);
}
function onEdit() {
var guiaativa = SpreadsheetApp.getActive().getSheetName();
if (guiaativa == "Principal"){
var guiadados = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Principal");
var linha = guiadados.getActiveCell().getRow();
var coluna = guiadados.getActiveCell().getColumn();
if(coluna == 3 && linha == 4){
numnota(); // Executa a função numnota()
}
}
}
3. Preenchimento Automático da Data: Com um simples clique no ícone do calendário, a data atual é preenchida automaticamente, assegurando que a informação esteja sempre atualizada.
function datahoje() {
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guiamenu = planilha.getSheetByName("Principal");
var datalimpa = Utilities.formatDate(new Date(), "GMT", "dd/MM/yyyy");
guiamenu.getRange("H5").setValue(datalimpa);
}
4. Exportação para PDF: Um botão “Gerar PDF” permite a exportação rápida e fácil do orçamento em formato PDF, facilitando o compartilhamento e a impressão.
var PRINT_OPTIONS = {
'size': 7, // Tamanho do papel. 0 = carta, 1 = tablóide, 2 = Ofício, 3 = declaração, 4 = executivo, 5 = fólio, 6 = A3, 7 = A4, 8 = A5, 9 = B4, 10 = B
'fzr': false, // repetir cabeçalhos de linha
'portrait': true, // false = paisagem, true = retrato
'fitw': true, // ajustar a janela ou tamanho real
'gridlines': false, // mostrar linhas de grade
'printtitle': false, // false = sem título, true = título vai ser o nome da planilha
'sheetnames': false, //true coloca nome da guia da planilha no pdf
'pagenum': 'UNDEFINED', // CENTRO = mostrar números de página / UNDEFINED = não mostrar
'attachment': true //true para baixar arquivo pdf
}
var PDF_OPTS = objectToQueryString(PRINT_OPTIONS);
function Pdf() {
var nomeGuia = "Principal";
/*var nomePdf = "Orçamento_" + "C4";*/
var area = "A1:I43";
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guia = planilha.getSheetByName(nomeGuia);
var range = guia.getRange(area).activate();
var nomePlan = planilha.getName();
var cliente = guia.getRange("C4").getValue();
var nomePdf = "Orçamento_" + cliente;
planilha.rename(nomePdf);
planilha.getSheetByName(nomeGuia).setName(" ");
var gid = SpreadsheetApp.getActiveSpreadsheet().getSheetId();
var printRange = objectToQueryString({
'c1': range.getColumn() - 1,
'r1': range.getRow() - 1,
'c2': range.getColumn() + range.getWidth() - 1,
'r2': range.getRow() + range.getHeight() - 1
});
var url = planilha.getUrl().replace(/edit$/, '') + 'export?exportFormat=pdf&format=pdf' + PDF_OPTS + printRange + "&gid=" + gid;
var html = "<script>window.open('" + url + "');google.script.host.close();</script>";
var userInterface = HtmlService.createHtmlOutput(html)
.setHeight(10)
.setWidth(100);
SpreadsheetApp.getUi().showModalDialog(userInterface, 'Baixando PDF ... ');
Utilities.sleep(8000);
guia.getRange("A1").activate();
planilha.rename(nomePlan);
planilha.getSheetByName(" ").setName(nomeGuia);
}
function objectToQueryString(obj) {
return Object.keys(obj).map(function(key) {
return Utilities.formatString('&%s=%s', key, obj[key]);
}).join('');
}
5. Limpeza de Campos: O botão de limpar, quando acionado, apaga todos os campos preenchidos, preparando o modelo para um novo orçamento sem esforço.
function limparOrcamento(){
var planilha = SpreadsheetApp.getActiveSpreadsheet();
var guiamenu = planilha.getSheetByName("Principal");
/*Cliente*/
guiamenu.getRange("C4").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("C5").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("C6").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("H4").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("H5").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("B9:H23").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("B25:H31").clear({contentsOnly:true, skipFilteredRows:true});
guiamenu.getRange("H34").setValue("0");
}
Com essas melhorias, o cliente Azevedo agora possui uma ferramenta robusta que não só melhora a apresentação dos orçamentos, mas também agiliza todo o processo de criação e gestão de propostas financeiras.
0 Comentários