///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////
// Sistema de Controle de Empréstimos - InovaLab IFSC - Campus Continente
//
// Autor Principal: Prof. Rogério G. Bittencourt
//
// Este arquivo consolida todos os scripts utilizados para automação do sistema
//
///////////////////////////////////////////////////////////////////////////////////
/////////////////////////////
//////////////////// MENU PERSONALIZADO ////////////////////
function onOpen() {
var ui = [Link]();
[Link]('InovaLab')
.addItem('Importar Empréstimos do Forms', 'importarRespostasForms')
.addItem('Atualizar Estoque', 'atualizarEstoque')
.addItem('Enviar Alertas de Devolução', 'enviarAlertasDevolucao')
.addToUi();
}
//////////////////// 1. IMPORTAÇÃO DAS RESPOSTAS DO FORM ////////////////////
function importarRespostasForms() {
const ssForms =
[Link]('1DwtoZ76mKCLBbgOCpByphoxsG9v3GtPaUmtEs1h8LYg');
const sheetForms = [Link]('Respostas_Form');
const dadosForms = [Link]().getValues();
const ssPrincipal = [Link]();
const abaEmprestimos = [Link]('Empréstimos');
const historico = [Link]('Histórico');
const codigosRegistrados = [Link](2, 4,
[Link]() - 1).getValues().flat();
for (let i = 1; i < [Link]; i++) {
const linha = dadosForms[i];
const timestamp = linha[0];
const email = linha[1];
const nome = linha[2];
const equipamento = linha[3];
const codigo = linha[4];
const categoria = linha[5];
const armario = linha[6];
const prateleira = linha[7];
const dataRetirada = linha[8];
const dataPrevista = linha[9];
if ([Link](codigo)) continue;
[Link]([
new Date(), nome, equipamento, codigo, categoria, armario,
prateleira, "Externo", "Uso via formulário", dataPrevista,
"Não", "Em uso", email
]);
[Link]([
new Date(), "Empréstimo", nome, equipamento, codigo, categoria,
`${armario}-${prateleira}`, "Registrado via Google Forms"
]);
}
[Link]().alert("Importação de respostas concluída.");
}
//////////////////// 2. ALERTA DE DEVOLUÇÃO PENDENTE ////////////////////
function enviarAlertasDevolucao() {
const aba = [Link]().getSheetByName("Empréstimos");
const dados = [Link]().getValues();
const hoje = new Date();
const remetente = [Link]().getEmail();
for (let i = 1; i < [Link]; i++) {
const linha = dados[i];
const dataPrevista = new Date(linha[9]);
const email = linha[12];
const nome = linha[1];
const equipamento = linha[2];
const codigo = linha[3];
if (dataPrevista && hoje > dataPrevista) {
const assunto = `⚠️ InovaLab – Devolução Pendente (${equipamento})`;
const corpo = `Olá ${nome},
Este é um lembrete automático do InovaLab. O equipamento:
` +
`• Nome: ${equipamento}
` +
`• Código: ${codigo}
` +
`• Deveria ter sido devolvido em: $
{[Link]()}
` +
`Por favor, providencie a devolução imediata ou entre em contato
com a equipe do InovaLab.
` +
`Atenciosamente,
Equipe InovaLab – IFSC Campus Continente`;
[Link]({
to: email,
subject: assunto,
body: corpo,
replyTo: remetente
});
}
}
[Link]().alert("Alertas de devolução enviados com sucesso.");
}
//////////////////// 3. CONTROLE DE ESTOQUE AUTOMATIZADO ////////////////////
function atualizarEstoque() {
const ss = [Link]();
const abaEstoque = [Link]("Controle de Estoque");
const abaMov = [Link]("Movimentação de Estoque");
if (!abaEstoque || !abaMov) {
[Link]().alert("Verifique se as abas 'Controle de Estoque' e
'Movimentação de Estoque' existem.");
return;
}
const dadosEstoque = [Link]().getValues();
const dadosMov = [Link]().getValues();
let mapaEstoque = {};
for (let i = 1; i < [Link]; i++) {
const codigo = dadosEstoque[i][0];
const quantidadeAtual = Number(dadosEstoque[i][3]) || 0;
mapaEstoque[codigo] = {
row: i + 1,
quantidadeInicial: quantidadeAtual,
novoSaldo: quantidadeAtual
};
}
for (let i = 1; i < [Link]; i++) {
const [data, tipo, codigo, nome, categoria, quantidade] = dadosMov[i];
if (!mapaEstoque[codigo]) continue;
const qtd = Number(quantidade) || 0;
if (tipo === "Saída") mapaEstoque[codigo].novoSaldo -= qtd;
else if (tipo === "Entrada") mapaEstoque[codigo].novoSaldo += qtd;
}
for (let codigo in mapaEstoque) {
const info = mapaEstoque[codigo];
[Link]([Link], 4).setValue([Link]);
}
[Link]().alert("Estoque atualizado com sucesso.");
}