Planilha de cotação de preços
O objetivo da planilha equalizar os preços em diferentes pontos de vista.
Na planilha podemos analisar cenarios difernte como mellhor pacote, melhor proposta, melhor fornecedor.
Podemos tambem observar a coluna de ICMS que realiza o calculo com difal por dentro.
Planilha para consolidação de carga
O objetivo da planilha é simular aproveitamento de ocuação de carga, informando os dados da cubagem e sugestionando qual veiculo proporciona melhor aproveitmento de ocupação.
Relatorio de volume de e-mail por remetente no gmail.
Ferramentas utilizadas (gmail, apps script google, google drive)
function generateAllEmailsReport() {
// Configuração inicial
var spreadsheet = SpreadsheetApp.create("Relatório Completo de Todos os E-mails");
var sheet = spreadsheet.getActiveSheet();
// Cabeçalhos melhorados
sheet.clear();
sheet.appendRow([
"Remetente",
"Total",
"Primeiro E-mail",
"Último E-mail",
"Frequência (dias)",
"Assuntos Exemplo"
]);
// Busca estratégica por períodos
var allYears = getYearRanges(); // Busca desde 2004 (início do Gmail)
var senderData = {};
var totalProcessed = 0;
// Processa cada período histórico
for (var y = 0; y < allYears.length; y++) {
var query = 'in:all -label:chats after:' + allYears[y].start + ' before:' + allYears[y].end;
console.log("Processando período: " + query);
var threads = GmailApp.search(query);
console.log("Encontradas " + threads.length + " conversas neste período");
// Processa cada conversa
for (var i = 0; i < threads.length; i++) {
var messages = threads[i].getMessages();
for (var j = 0; j < messages.length; j++) {
processMessage(messages[j], senderData);
totalProcessed++;
}
}
// Atualização de progresso
var progress = Math.round((y+1)/allYears.length*100);
console.log("Progresso: " + progress + "%");
}
// Preenche a planilha
fillSheet(sheet, senderData);
// Finalização
console.log("Processamento completo! Total: " + totalProcessed + " e-mails");
console.log("Planilha disponível em: " + spreadsheet.getUrl());
return spreadsheet.getUrl();
}
// Funções auxiliares
function getYearRanges() {
var ranges = [];
var currentYear = new Date().getFullYear();
// Gera intervalos desde 2004 (início do Gmail) até o ano atual
for (var year = 2004; year <= currentYear; year++) {
ranges.push({
start: year + '/01/01',
end: year + '/12/31'
});
}
// Adiciona intervalo "extra" para capturar tudo
ranges.push({
start: '2004/01/01',
end: new Date().toISOString().split('T')[0]
});
return ranges;
}
function processMessage(msg, senderData) {
var sender = extractPureEmail(msg.getFrom());
if (!sender) return;
var date = msg.getDate();
var subject = msg.getSubject();
if (!senderData[sender]) {
senderData[sender] = {
count: 0,
firstDate: date,
lastDate: date,
subjects: new Set()
};
}
// Atualiza dados
senderData[sender].count++;
if (date < senderData[sender].firstDate) senderData[sender].firstDate = date;
if (date > senderData[sender].lastDate) senderData[sender].lastDate = date;
if (senderData[sender].subjects.size < 5) senderData[sender].subjects.add(subject);
}
function extractPureEmail(raw) {
var emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/;
var match = raw.match(emailRegex);
return match ? match[0].toLowerCase() : null;
}
function fillSheet(sheet, data) {
var row = 2;
for (var sender in data) {
var info = data[sender];
sheet.getRange(row, 1).setValue(sender);
sheet.getRange(row, 2).setValue(info.count);
sheet.getRange(row, 3).setValue(info.firstDate);
sheet.getRange(row, 4).setValue(info.lastDate);
// Calcula frequência média
var daysBetween = (info.lastDate - info.firstDate)/(1000*60*60*24);
var frequency = info.count > 1 ? (daysBetween/(info.count-1)).toFixed(1) : "Único";
sheet.getRange(row, 5).setValue(frequency);
sheet.getRange(row, 6).setValue(Array.from(info.subjects).join("\n\n"));
row++;
}
// Formatação avançada
sheet.setColumnWidth(1, 280);
sheet.setColumnWidth(6, 500);
sheet.getRange(2, 3, sheet.getLastRow()-1, 2)
.setNumberFormat("yyyy-mm-dd hh:mm:ss");
sheet.getRange(1, 1, 1, 6)
.setBackground("#2c3e50")
.setFontColor("white")
.setFontWeight("bold");
// Ordena por total
sheet.getRange(2, 1, sheet.getLastRow()-1, 6)
.sort({column: 2, ascending: false});
}