Tutorial: Processar Planilhas do Google Sheets
Neste tutorial, você vai criar um sistema de automação para processar dados em planilhas do Google Sheets, validar informações, fazer cálculos e gerar relatórios automaticamente.
O Que Você Vai Construir
Um sistema completo de ETL (Extract, Transform, Load) que:
- Lê dados de uma planilha Google Sheets
- Valida e limpa os dados
- Faz cálculos e transformações
- Enriquece dados com APIs externas
- Gera relatórios consolidados
- Salva resultados em outra aba da planilha
- Envia notificação por email com resumo
Tempo estimado: 25 minutos
Pré-requisitos
- ✅ Conta no Lumina Flow Builder
- ✅ Conta Google com acesso ao Google Sheets
- ✅ Tutorial básico completo (Primeiro Flow)
- ✅ Planilha de exemplo criada
Caso de Uso
Você tem uma planilha com dados de vendas diárias que precisa:
- Validar dados de entrada
- Calcular totais e comissões
- Buscar informações de produtos
- Gerar relatório consolidado
- Atualizar planilha automaticamente
Passo 1: Configurar Google Sheets API
1.1. Criar Credenciais
- Acesse Google Cloud Console
- Crie um novo projeto ou selecione existente
- Ative a Google Sheets API
- Crie credenciais:
- Tipo: Service Account
- Nome: "Lumina Flow Builder"
- Baixe o arquivo JSON de credenciais
- Compartilhe sua planilha com o email da service account
1.2. Preparar Planilha de Exemplo
Crie uma planilha com estas abas:
Aba "Vendas" (dados de entrada):
| Data | Vendedor | Produto ID | Quantidade | Valor Unit |
|------------|----------|------------|------------|------------|
| 2025-01-10 | João | PROD001 | 5 | 50.00 |
| 2025-01-10 | Maria | PROD002 | 3 | 75.00 |
| 2025-01-11 | João | PROD001 | 2 | 50.00 |
Aba "Relatório" (dados de saída):
| Data | Total Vendas | Comissão | Top Vendedor |
|------------|--------------|----------|--------------|
| (vazio) | (vazio) | (vazio) | (vazio) |
Aba "Produtos" (referência):
| ID | Nome | Categoria | Estoque |
|---------|---------------|-----------|---------|
| PROD001 | Produto A | Eletrônico| 100 |
| PROD002 | Produto B | Livros | 50 |
Passo 2: Criar o Flow
2.1. Novo Flow
- Dashboard → "+ Novo Flow"
- Nome: "Processar Vendas - Google Sheets"
- Descrição: "ETL automático de dados de vendas"
- Tags: "sheets", "etl", "vendas"
2.2. Adicionar Variáveis
Clique em Configurações e adicione:
{
"spreadsheetId": "1ABC...xyz",
"serviceAccountKey": {
"type": "service_account",
"project_id": "seu-projeto",
"private_key_id": "...",
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"client_email": "lumina@seu-projeto.iam.gserviceaccount.com",
"client_id": "...",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token"
},
"comissionRate": 0.1,
"emailRecipient": "gerente@empresa.com"
}
Passo 3: Configurar Trigger
3.1. Schedule Trigger
Vamos executar diariamente:
- Adicione "Schedule" trigger
- Configure:
- Nome: "Executar Diariamente"
- Cron Expression:
0 8 * * *(todo dia às 8h) - Timezone:
America/Sao_Paulo
3.2. Ou Webhook Trigger
Alternativamente, para execução sob demanda:
- Adicione "Webhook" trigger
- Configure:
- Nome: "Processar Manualmente"
- Método: POST
Passo 4: Autenticar com Google
4.1. Obter Access Token
Adicione nó "HTTP Request" chamado "Obter Token Google":
// Method
POST
// URL
{{ $vars.serviceAccountKey.token_uri }}
// Headers
{
"Content-Type": "application/x-www-form-urlencoded"
}
// Body (form-urlencoded)
{
"grant_type": "urn:ietf:params:oauth:grant-type:jwt-bearer",
"assertion": "{{ $vars.jwtToken }}"
}
Nota: Para simplificar, use uma biblioteca JWT ou gere o token previamente.
4.2. Alternativa: Use Nó Nativo
Se disponível, use o nó "Google Sheets" nativo:
- Arraste "Google Sheets" para o canvas
- Configure:
- Action: Read
- Credentials: Cole o JSON da service account
- Spreadsheet ID:
{{ $vars.spreadsheetId }}
Passo 5: Ler Dados da Planilha
5.1. Ler Aba "Vendas"
Adicione nó "HTTP Request" chamado "Ler Vendas":
// Method
GET
// URL
https://sheets.googleapis.com/v4/spreadsheets/{{ $vars.spreadsheetId }}/values/Vendas!A2:E1000
// Headers
{
"Authorization": "Bearer {{ $nodes['obter-token'].output.data.access_token }}",
"Content-Type": "application/json"
}
Ou com nó nativo:
// Google Sheets Node
{
"action": "read",
"spreadsheetId": "{{ $vars.spreadsheetId }}",
"range": "Vendas!A2:E1000"
}
5.2. Transformar em Objetos
Adicione "Transform" chamado "Transformar Vendas":
{{
(() => {
const rows = $node.output.data.values || [];
return rows.map(row => ({
data: row[0],
vendedor: row[1],
produtoId: row[2],
quantidade: parseInt(row[3]) || 0,
valorUnit: parseFloat(row[4]) || 0,
total: (parseInt(row[3]) || 0) * (parseFloat(row[4]) || 0)
}));
})()
}}
Passo 6: Ler Dados de Produtos
6.1. Ler Aba "Produtos"
Adicione "HTTP Request" chamado "Ler Produtos":
// URL
https://sheets.googleapis.com/v4/spreadsheets/{{ $vars.spreadsheetId }}/values/Produtos!A2:D100
// Headers
{
"Authorization": "Bearer {{ $nodes['obter-token'].output.data.access_token }}"
}
6.2. Criar Lookup de Produtos
Adicione "Transform" chamado "Criar Lookup Produtos":
{{
(() => {
const rows = $node.output.data.values || [];
return rows.reduce((acc, row) => {
acc[row[0]] = {
id: row[0],
nome: row[1],
categoria: row[2],
estoque: parseInt(row[3]) || 0
};
return acc;
}, {});
})()
}}
Passo 7: Validar e Enriquecer Dados
7.1. Validar Vendas
Adicione "Transform" chamado "Validar e Enriquecer":
{{
(() => {
const vendas = $nodes['transformar-vendas'].output;
const produtos = $nodes['criar-lookup-produtos'].output;
const errors = [];
const valid = [];
vendas.forEach((venda, index) => {
// Validações
if (!venda.data || !venda.vendedor || !venda.produtoId) {
errors.push({
linha: index + 2,
erro: 'Dados obrigatórios ausentes',
venda
});
return;
}
if (venda.quantidade <= 0) {
errors.push({
linha: index + 2,
erro: 'Quantidade inválida',
venda
});
return;
}
const produto = produtos[venda.produtoId];
if (!produto) {
errors.push({
linha: index + 2,
erro: 'Produto não encontrado',
venda
});
return;
}
// Verificar estoque
if (venda.quantidade > produto.estoque) {
errors.push({
linha: index + 2,
erro: 'Estoque insuficiente',
venda,
produto
});
return;
}
// Enriquecer dados
valid.push({
...venda,
produto: produto.nome,
categoria: produto.categoria,
total: venda.quantidade * venda.valorUnit,
comissao: venda.quantidade * venda.valorUnit * $vars.comissionRate
});
});
return {
valid,
errors,
validCount: valid.length,
errorCount: errors.length
};
})()
}}
Passo 8: Processar e Calcular
8.1. Calcular Métricas
Adicione "Transform" chamado "Calcular Métricas":
{{
(() => {
const vendas = $node.output.valid;
// Total de vendas
const totalVendas = vendas.reduce((sum, v) => sum + v.total, 0);
// Total de comissões
const totalComissoes = vendas.reduce((sum, v) => sum + v.comissao, 0);
// Vendas por vendedor
const vendasPorVendedor = vendas.reduce((acc, v) => {
acc[v.vendedor] = (acc[v.vendedor] || 0) + v.total;
return acc;
}, {});
// Top vendedor
const topVendedor = Object.entries(vendasPorVendedor)
.sort(([,a], [,b]) => b - a)[0];
// Vendas por categoria
const vendasPorCategoria = vendas.reduce((acc, v) => {
acc[v.categoria] = (acc[v.categoria] || 0) + v.total;
return acc;
}, {});
// Ticket médio
const ticketMedio = totalVendas / vendas.length;
return {
data: new Date().toISOString().split('T')[0],
totalVendas: totalVendas.toFixed(2),
totalComissoes: totalComissoes.toFixed(2),
topVendedor: topVendedor[0],
topVendedorTotal: topVendedor[1].toFixed(2),
ticketMedio: ticketMedio.toFixed(2),
quantidadeVendas: vendas.length,
vendasPorVendedor,
vendasPorCategoria
};
})()
}}
Passo 9: Gerar Relatório
9.1. Formatar Dados para Planilha
Adicione "Transform" chamado "Formatar Relatório":
{{
(() => {
const metricas = $node.output;
// Linha do relatório
const reportRow = [
metricas.data,
metricas.totalVendas,
metricas.totalComissoes,
metricas.topVendedor,
metricas.topVendedorTotal,
metricas.ticketMedio,
metricas.quantidadeVendas
];
// Detalhes por vendedor
const vendedorRows = Object.entries(metricas.vendasPorVendedor)
.map(([vendedor, total]) => [
metricas.data,
vendedor,
total.toFixed(2),
(total * $vars.comissionRate).toFixed(2)
]);
return {
reportRow,
vendedorRows
};
})()
}}
Passo 10: Escrever na Planilha
10.1. Atualizar Aba "Relatório"
Adicione "HTTP Request" chamado "Escrever Relatório":
// Method
POST
// URL
https://sheets.googleapis.com/v4/spreadsheets/{{ $vars.spreadsheetId }}/values/Relatório!A2:append?valueInputOption=RAW
// Headers
{
"Authorization": "Bearer {{ $nodes['obter-token'].output.data.access_token }}",
"Content-Type": "application/json"
}
// Body
{
"values": [
{{ $node.output.reportRow }}
]
}
10.2. Criar Aba de Detalhes
Adicione "HTTP Request" chamado "Escrever Detalhes Vendedor":
// URL
https://sheets.googleapis.com/v4/spreadsheets/{{ $vars.spreadsheetId }}/values/Detalhes!A2:append?valueInputOption=RAW
// Body
{
"values": {{ $node.output.vendedorRows }}
}
Passo 11: Enviar Notificação
11.1. Preparar Email
Adicione "Transform" chamado "Preparar Email":
{{
(() => {
const metricas = $nodes['calcular-metricas'].output;
const erros = $nodes['validar-e-enriquecer'].output.errors;
const html = `
<h2>📊 Relatório Diário de Vendas</h2>
<p><strong>Data:</strong> ${metricas.data}</p>
<h3>Resumo</h3>
<ul>
<li><strong>Total de Vendas:</strong> R$ ${metricas.totalVendas}</li>
<li><strong>Total de Comissões:</strong> R$ ${metricas.totalComissoes}</li>
<li><strong>Quantidade de Vendas:</strong> ${metricas.quantidadeVendas}</li>
<li><strong>Ticket Médio:</strong> R$ ${metricas.ticketMedio}</li>
</ul>
<h3>🏆 Top Vendedor</h3>
<p><strong>${metricas.topVendedor}</strong> - R$ ${metricas.topVendedorTotal}</p>
<h3>Vendas por Vendedor</h3>
<table border="1" cellpadding="5">
<tr>
<th>Vendedor</th>
<th>Total</th>
</tr>
${Object.entries(metricas.vendasPorVendedor)
.map(([v, t]) => `<tr><td>${v}</td><td>R$ ${t.toFixed(2)}</td></tr>`)
.join('')}
</table>
${erros.length > 0 ? `
<h3>⚠️ Erros Encontrados (${erros.length})</h3>
<ul>
${erros.map(e => `<li>Linha ${e.linha}: ${e.erro}</li>`).join('')}
</ul>
` : ''}
<hr>
<p><small>Relatório gerado automaticamente pelo Lumina Flow Builder</small></p>
`;
return {
to: $vars.emailRecipient,
subject: `Relatório de Vendas - ${metricas.data}`,
html
};
})()
}}
11.2. Enviar Email
Adicione "HTTP Request" chamado "Enviar Email":
// Use seu serviço de email (SendGrid, Mailgun, etc)
// Method
POST
// URL
https://api.sendgrid.com/v3/mail/send
// Headers
{
"Authorization": "Bearer {{ $vars.sendgridApiKey }}",
"Content-Type": "application/json"
}
// Body
{
"personalizations": [{
"to": [{"email": "{{ $node.output.to }}"}]
}],
"from": {"email": "noreply@empresa.com"},
"subject": "{{ $node.output.subject }}",
"content": [{
"type": "text/html",
"value": "{{ $node.output.html }}"
}]
}
Passo 12: Tratamento de Erros
12.1. Verificar Erros Críticos
Adicione "If/Else" para verificar se há muitos erros:
// Condition
{{ $nodes['validar-e-enriquecer'].output.errorCount > 10 }}
12.2. Enviar Alerta
Se houver muitos erros, envie alerta:
{
"to": "admin@empresa.com",
"subject": "⚠️ ALERTA: Muitos erros no processamento de vendas",
"html": "Foram encontrados {{ $nodes['validar-e-enriquecer'].output.errorCount }} erros. Verifique a planilha urgentemente."
}
Passo 13: Logging
13.1. Adicionar Logs
Adicione "Log" nodes em pontos chave:
// Log: Início
{{
{
"event": "processing_started",
"timestamp": new Date().toISOString()
}
}}
// Log: Dados Lidos
{{
{
"event": "data_loaded",
"vendasCount": $nodes['transformar-vendas'].output.length,
"produtosCount": Object.keys($nodes['criar-lookup-produtos'].output).length
}
}}
// Log: Validação
{{
{
"event": "validation_completed",
"valid": $node.output.validCount,
"errors": $node.output.errorCount
}
}}
// Log: Conclusão
{{
{
"event": "processing_completed",
"metrics": $nodes['calcular-metricas'].output
}
}}
Estrutura Final do Flow
Trigger (Schedule/Webhook)
↓
Obter Token Google
↓
[Paralelo] → Ler Vendas → Transformar Vendas
↓ → Ler Produtos → Criar Lookup
↓
Validar e Enriquecer
↓
Tem Muitos Erros? → Sim → Enviar Alerta
↓ Não
↓
Calcular Métricas
↓
Formatar Relatório
↓
[Paralelo] → Escrever Relatório
↓ → Escrever Detalhes
↓
Preparar Email
↓
Enviar Email
↓
Log Conclusão
Passo 14: Testar
14.1. Teste Manual
- Clique em "Testar Flow"
- Veja os logs em tempo real
- Verifique a planilha após execução
- Confirme recebimento do email
14.2. Verificar Resultados
Abra a planilha e confira:
- ✅ Aba "Relatório" atualizada
- ✅ Aba "Detalhes" com dados por vendedor
- ✅ Email recebido com resumo
Melhorias Avançadas
1. Adicionar Gráficos
Use a API do Google Sheets para criar gráficos:
{
"requests": [{
"addChart": {
"chart": {
"spec": {
"title": "Vendas por Vendedor",
"basicChart": {
"chartType": "COLUMN",
"domains": [...],
"series": [...]
}
}
}
}
}]
}
2. Integrar com BigQuery
Para análises mais complexas:
// HTTP Request to BigQuery API
{
"query": "SELECT vendedor, SUM(total) FROM vendas GROUP BY vendedor"
}
3. Adicionar Machine Learning
Previsão de vendas com API de ML:
// Usar TensorFlow.js ou API externa
{
"historicalData": [...],
"predictDays": 7
}
4. Dashboard em Tempo Real
Integre com Data Studio ou Power BI.
Conceitos Aprendidos
Você aprendeu:
- ✅ Integrar com Google Sheets API
- ✅ Autenticar com Service Account
- ✅ Ler e escrever dados em planilhas
- ✅ Validar e limpar dados
- ✅ Fazer cálculos e agregações
- ✅ Enriquecer dados com lookup
- ✅ Gerar relatórios automáticos
- ✅ Enviar notificações por email
- ✅ Processar dados em paralelo
- ✅ Implementar error handling robusto
Próximos Passos
- Automatizar Mais Processos
- Conciliação bancária
- Gestão de inventário
-
Folha de pagamento
-
Integrar Outras Fontes
- APIs de CRM
- Bancos de dados SQL
-
Arquivos CSV/Excel
-
Criar Dashboards
- Google Data Studio
- Power BI
- Grafana