Nova Decisão
Preencha os dados abaixo. Após salvar, use os botões para gerar PDF ou enviar por e-mail antes de iniciar um novo registro.
Clique para selecionar ou arraste aqui
Print de WhatsApp, e-mail, documento — JPG, PNG ou PDF até 10MB
Enviando para o Google Drive...
Histórico de Decisões
| Cliente | Data | Decisões Tomadas | Contexto | Responsável | Por | Evidência | Ações |
|---|---|---|---|---|---|---|---|
Nenhum registro ainda Configure o Google Sheets e comece a registrar | |||||||
Cadastro de Clientes
Gerencie a lista de clientes. Os nomes cadastrados aparecem no formulário de Nova Decisão.
Pressione Enter ou vírgula para adicionar cada e-mail
Clientes cadastrados
Nenhum cliente ainda
Adicione o primeiro cliente acimaConfiguração
Para o upload de evidências: Crie uma pasta no Google Drive chamada N2FX Evidencias, abra-a e copie o ID da URL (após
/folders/). Cole no campo abaixo.
Antes de começar: Crie uma pasta no Google Drive chamada BPO Evidencias. Abra a pasta e copie o ID que aparece na URL do navegador — é a sequência de letras e números após
/folders/. Cole esse ID no campo abaixo.
1
Crie a planilha no Google Sheets
A planilha precisará de duas abas: Decisoes e Clientes. O script cria automaticamente se não existirem.
2
Cole o Apps Script abaixo
Na planilha: Extensões → Apps Script. Apague tudo, cole o código e salve.
function getOrCreateSheet(name) {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(name);
if (!sheet) {
sheet = ss.insertSheet(name);
if (name === 'Decisoes') {
sheet.appendRow(['Data','Cliente','Decisoes','Contexto','Responsavel','Autor','Timestamp','AnexoUrl']);
} else if (name === 'Clientes') {
sheet.appendRow(['Nome','Emails']);
} else if (name === 'Usuarios') {
sheet.appendRow(['Nome','Login','Senha','Perfil']);
// Cria admin padrão (troque a senha após o primeiro acesso)
sheet.appendRow(['Administrador','admin','n2fx@admin','admin']);
}
}
return sheet;
}
function doPost(e) {
// Suporta envio via JSON direto (fetch) ou via formulário HTML (iframe upload)
var raw = (e.postData && e.postData.contents) ? e.postData.contents
: (e.parameter && e.parameter.payload) ? e.parameter.payload
: '{}';
var payload = JSON.parse(raw);
if (payload.action === 'saveDecisao') {
var sheet = getOrCreateSheet('Decisoes');
sheet.appendRow([
payload.data, payload.cliente, payload.decisoes,
payload.contexto, payload.responsavel, payload.autor,
new Date().toLocaleString('pt-BR'),
payload.anexoUrl || ''
]);
return ok('decisao salva');
}
if (payload.action === 'saveUsuario') {
var sheet = getOrCreateSheet('Usuarios');
// Verifica se login já existe
var rows = sheet.getDataRange().getValues();
for (var i = 1; i < rows.length; i++) {
if (rows[i][1] === payload.login) {
return ok('login_duplicado');
}
}
sheet.appendRow([payload.nome, payload.login, payload.senha, payload.perfil]);
return ok('usuario salvo');
}
if (payload.action === 'deleteUsuario') {
var sheet = getOrCreateSheet('Usuarios');
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][1] === payload.login) { sheet.deleteRow(i + 1); break; }
}
return ok('usuario removido');
}
if (payload.action === 'uploadFile') {
var folderId = payload.folderId;
var folder = DriveApp.getFolderById(folderId);
var blob = Utilities.newBlob(
Utilities.base64Decode(payload.base64),
payload.mimeType,
payload.fileName
);
var file = folder.createFile(blob);
file.setSharing(DriveApp.Access.ANYONE_WITH_LINK, DriveApp.Permission.VIEW);
var fileUrl = 'https://drive.google.com/file/d/' + file.getId() + '/view';
return ContentService
.createTextOutput(JSON.stringify({ status: 'ok', url: fileUrl }))
.setMimeType(ContentService.MimeType.JSON);
}
if (payload.action === 'saveCliente') {
var sheet = getOrCreateSheet('Clientes');
sheet.appendRow([payload.nome, payload.emails]);
return ok('cliente salvo');
}
if (payload.action === 'deleteCliente') {
var sheet = getOrCreateSheet('Clientes');
var data = sheet.getDataRange().getValues();
for (var i = 1; i < data.length; i++) {
if (data[i][0] === payload.nome) { sheet.deleteRow(i + 1); break; }
}
return ok('cliente removido');
}
if (payload.action === 'sendEmail') {
var subject = payload.subject || 'Registro de Decisao - ' + payload.cliente;
var body = buildEmailBody(payload);
GmailApp.sendEmail(payload.emails, subject, body, {
name: payload.remetente || 'BPO Financeiro'
});
return ok('email enviado');
}
return ok('acao desconhecida');
}
function doGet(e) {
var type = e.parameter.type;
if (type === 'decisoes') {
var sheet = getOrCreateSheet('Decisoes');
var rows = sheet.getDataRange().getValues();
var headers = rows[0];
var data = rows.slice(1).map(function(row) {
var obj = {};
headers.forEach(function(h, i) { obj[h] = row[i]; });
return obj;
});
return json(data);
}
if (type === 'clientes') {
var sheet = getOrCreateSheet('Clientes');
var rows = sheet.getDataRange().getValues();
var data = rows.slice(1).map(function(row) {
return { nome: row[0], emails: row[1] };
});
return json(data);
}
if (type === 'usuarios') {
var sheet = getOrCreateSheet('Usuarios');
var rows = sheet.getDataRange().getValues();
var data = rows.slice(1).map(function(row) {
return { nome: row[0], login: row[1], senha: row[2], perfil: row[3] };
});
return json(data);
}
return json([]);
}
function buildEmailBody(p) {
return 'Prezado(a),\n\n' +
'Segue o registro da decisao tomada em reuniao com ' + p.cliente + '.\n\n' +
'------------------------------------------------------------\n' +
'CLIENTE: ' + p.cliente + '\nDATA: ' + p.data + '\n' +
'------------------------------------------------------------\n\n' +
'DECISOES TOMADAS:\n' + p.decisoes + '\n\n' +
(p.contexto ? 'CONTEXTO:\n' + p.contexto + '\n\n' : '') +
'RESPONSAVEL: ' + (p.responsavel || '-') + '\n' +
'REGISTRADO POR: ' + (p.autor || '-') + '\n\n' +
(p.anexoUrl ? 'EVIDÊNCIA: ' + p.anexoUrl + '\n\n' : '') +
'------------------------------------------------------------\n' +
'E-mail gerado automaticamente pelo sistema N2FX Inteligência Financeira.\n';
}
function ok(msg) {
return ContentService.createTextOutput(JSON.stringify({ status: 'ok', msg: msg }))
.setMimeType(ContentService.MimeType.JSON);
}
function json(data) {
return ContentService.createTextOutput(JSON.stringify(data))
.setMimeType(ContentService.MimeType.JSON);
}
3
Publique como Web App
Implantar → Nova implantação. Tipo: App da Web. Execute como: Eu. Acesso: Qualquer pessoa. Copie a URL gerada.
4
Cole a URL e o ID da pasta abaixo
A conta Gmail usada para publicar será a remetente dos e-mails e dona da pasta no Drive.
URL do Web App
ID da pasta no Google Drive (Evidências)
Nome do remetente
Assunto padrão do e-mail
Use {cliente} para inserir o nome do cliente automaticamente
Gerenciamento de Usuários
Cadastre e gerencie os membros do time. Cada usuário terá seu próprio login.
Usuários cadastrados
Carregando...