SHEETS_READ - Ler Dados do Google Sheets
O que é este Node?
O SHEETS_READ é o node responsável por ler dados de uma planilha do Google Sheets com autenticação OAuth2. Permite extrair valores de qualquer range (intervalo) da planilha para uso no fluxo.
Por que este Node existe?
Muitas empresas armazenam dados críticos em Google Sheets - desde listas de produtos até registros de clientes. O SHEETS_READ existe para:
- Integração com Dados Empresariais: Buscar informações de planilhas corporativas sem migração de dados
- Automação de Processos: Ler automaticamente dados atualizados para enviar mensagens personalizadas
- Consultas Dinâmicas: Verificar estoque, preços, cadastros diretamente da fonte
- Análise de Dados: Extrair informações para decisões em tempo real no fluxo
Como funciona internamente?
Quando o SHEETS_READ é executado, o sistema:
- Valida autenticação: Verifica se há tokens OAuth2 válidos (accessToken e refreshToken)
- Conecta ao Google Sheets API: Usa o cliente OAuth2 para autenticar
- Identifica a planilha: Extrai o spreadsheetId da URL ou usa o ID fornecido
- Define o range: Usa o range fornecido ou padrão 'Sheet1!A1:Z1000'
- Executa leitura: Chama spreadsheets.values.get() para obter os dados
- Retorna dados: Devolve array de arrays com os valores lidos
- Se erro: Lança exceção com mensagem detalhada
Código interno (google-executors.service.ts:756-766):
case 'read':
const readResult = await sheets.spreadsheets.values.get({
spreadsheetId: data.spreadsheetId,
range: data.range || 'Sheet1!A1:Z1000',
});
return {
success: true,
data: readResult.data.values,
rowCount: readResult.data.values?.length || 0,
};
Quando você DEVE usar este Node?
Use SHEETS_READ sempre que precisar buscar dados de uma planilha do Google Sheets:
Casos de uso
- CRM Manual: "Ler lista de clientes da planilha 'Cadastros' para enviar promoções personalizadas"
- Controle de Estoque: "Verificar estoque disponível na planilha antes de confirmar pedido"
- Base de Conhecimento: "Buscar respostas de FAQ armazenadas em Google Sheets"
- Relatórios: "Extrair dados de vendas para análise e geração de mensagens"
- Validação: "Verificar se número de telefone existe na planilha de autorizados"
Quando NÃO usar SHEETS_READ
- Dados estáticos pequenos: Use NODE VARIABLE para armazenar no fluxo
- Banco de dados relacional: Use NODE DATABASE para consultas SQL
- APIs REST: Use NODE API_CALL para endpoints HTTP
Parâmetros Detalhados
spreadsheetId (string, obrigatório)
O que é: ID da planilha do Google Sheets. Pode ser extraído da URL da planilha.
Exemplo de URL: https://docs.google.com/spreadsheets/d/1abc123xyz/edit
O spreadsheetId é: 1abc123xyz
Flow completo para testar:
{
"name": "Teste Sheets Read - SpreadsheetId",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Ler Planilha",
"parameters": {
"operation": "read",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Class Data!A1:E10",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Dados",
"parameters": {
"message": "Lidos {{sheets_1.rowCount}} linhas da planilha"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Configure os tokens OAuth2 do Google nas variáveis. O sistema deve retornar os dados da planilha.
range (string, opcional)
O que é: Range (intervalo) de células a ser lido usando notação A1. Define exatamente quais células serão extraídas.
Padrão: "Sheet1!A1:Z1000"
Formato da notação A1:
- A1:B10 - Da célula A1 até B10 (10 linhas, 2 colunas)
- Sheet1!A:A - Toda a coluna A da Sheet1
- Sheet1!1:1 - Toda a primeira linha da Sheet1
- Sheet1!A1:Z - Da coluna A até Z, todas as linhas
- Vendas!B2:D100 - Da célula B2 até D100 na aba 'Vendas'
Flow completo para testar:
{
"name": "Teste Sheets Read - Range",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Ler Coluna Nome",
"parameters": {
"operation": "read",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Class Data!A2:A50",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Mostrar Primeiro Nome",
"parameters": {
"message": "Primeiro nome encontrado: {{sheets_1.data.0.0}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: O sistema deve ler apenas a coluna A (nomes) da linha 2 até 50 e retornar o primeiro valor.
accessToken (string, obrigatório)
O que é: Token de acesso OAuth2 do Google para autenticar a requisição. Obtido através do fluxo OAuth2 do Google.
Como obter: 1. Configure Google Cloud Console com API Sheets habilitada 2. Configure OAuth2 Consent Screen 3. Crie credenciais OAuth 2.0 (Client ID e Client Secret) 4. Use o fluxo OAuth2 para obter o accessToken
Flow completo para testar:
{
"name": "Teste Sheets Read - AccessToken",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Configurar Token",
"parameters": {
"variableName": "google_access_token",
"value": "ya29.a0AfB_..."
}
}
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Ler Planilha",
"parameters": {
"operation": "read",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Sheet1!A1:C10",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Leitura realizada com sucesso!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "variable_1" },
{ "source": "variable_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Substitua o token por um válido do Google OAuth2. O sistema deve autenticar e ler a planilha.
refreshToken (string, obrigatório)
O que é: Token de atualização OAuth2 usado para obter novos accessTokens quando expiram. É de longa duração.
Padrão: Nenhum - deve ser fornecido
Flow completo para testar:
{
"name": "Teste Sheets Read - RefreshToken",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Ler Planilha",
"parameters": {
"operation": "read",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Sheet1!A1:B5",
"accessToken": "{{google_access_token}}",
"refreshToken": "1//0gABC123..."
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Confirmar",
"parameters": {
"message": "Dados lidos: {{sheets_1.rowCount}} linhas"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: O refreshToken garante que mesmo com accessToken expirado, o sistema obtenha um novo automaticamente.
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "read" para leitura |
| spreadsheetId | string | Sim | ID da planilha Google Sheets |
| range | string | Não | Range em notação A1 (padrão: Sheet1!A1:Z1000) |
| accessToken | string | Sim | Token OAuth2 de acesso |
| refreshToken | string | Sim | Token OAuth2 de atualização |
Exemplo 1: Ler Lista de Clientes para CRM
Objetivo: Ler cadastro de clientes de uma planilha e enviar mensagem personalizada
JSON para Importar
{
"name": "CRM - Ler Clientes do Sheets",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": {
"label": "Início",
"message": "Iniciando leitura de clientes"
}
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Buscar Clientes",
"parameters": {
"operation": "read",
"spreadsheetId": "1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgvE2upms",
"range": "Clientes!A2:D100",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Salvar Dados",
"parameters": {
"variableName": "clientes",
"value": "{{sheets_1.data}}"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Resumo",
"parameters": {
"message": "📊 Total de clientes encontrados: {{sheets_1.rowCount}}\n\nPrimeiro cliente: {{sheets_1.data.0.0}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Fim",
"message": "Leitura concluída com sucesso!"
}
}
],
"edges": [
{ "source": "start_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "variable_1" },
{ "source": "variable_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: Iniciando leitura de clientes
Sistema: 📊 Total de clientes encontrados: 98
Primeiro cliente: José Silva
Sistema: Leitura concluída com sucesso!
Exemplo 2: Verificar Estoque Antes de Confirmar Pedido
Objetivo: Consultar estoque em tempo real na planilha antes de processar pedido
JSON para Importar
{
"name": "E-commerce - Verificar Estoque",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Perguntar Produto",
"parameters": {
"prompt": "Qual produto você deseja? Digite o código:",
"variableName": "codigo_produto"
}
}
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Consultar Estoque",
"parameters": {
"operation": "read",
"spreadsheetId": "1ABC_EstoqueControle_XYZ",
"range": "Produtos!A:D",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Tem Estoque?",
"parameters": {
"condition": "{{sheets_1.data.length}} > 0"
}
}
},
{
"id": "message_success",
"type": "message",
"position": { "x": 900, "y": 50 },
"data": {
"label": "Produto Disponível",
"parameters": {
"message": "✅ Produto em estoque! Quantidade: {{sheets_1.data.0.3}}"
}
}
},
{
"id": "message_fail",
"type": "message",
"position": { "x": 900, "y": 150 },
"data": {
"label": "Sem Estoque",
"parameters": {
"message": "❌ Produto indisponível no momento"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "condition_1" },
{ "source": "condition_1", "target": "message_success", "label": "true" },
{ "source": "condition_1", "target": "message_fail", "label": "false" },
{ "source": "message_success", "target": "end_1" },
{ "source": "message_fail", "target": "end_1" }
]
}
Saída esperada:
Sistema: Qual produto você deseja? Digite o código:
Usuário: PROD001
Sistema: ✅ Produto em estoque! Quantidade: 45
Exemplo 3: Base de Conhecimento de FAQ
Objetivo: Buscar respostas de perguntas frequentes armazenadas no Google Sheets
JSON para Importar
{
"name": "FAQ Automático com Sheets",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Olá! Consultando nossa base de FAQ..."
}
}
},
{
"id": "sheets_1",
"type": "google_sheets",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Carregar FAQ",
"parameters": {
"operation": "read",
"spreadsheetId": "1FAQ_Database_XYZ",
"range": "FAQ!A2:B50",
"accessToken": "{{google_access_token}}",
"refreshToken": "{{google_refresh_token}}"
}
}
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Armazenar FAQ",
"parameters": {
"variableName": "faq_lista",
"value": "{{sheets_1.data}}"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Mostrar FAQ",
"parameters": {
"message": "📚 Base de FAQ carregada com {{sheets_1.rowCount}} perguntas!\n\nPrimeira pergunta: {{sheets_1.data.0.0}}\nResposta: {{sheets_1.data.0.1}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "sheets_1" },
{ "source": "sheets_1", "target": "variable_1" },
{ "source": "variable_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Olá! Consultando nossa base de FAQ...
Sistema: 📚 Base de FAQ carregada com 48 perguntas!
Primeira pergunta: Qual o horário de funcionamento?
Resposta: Funcionamos de segunda a sexta, das 8h às 18h.
Resposta do Node
{
"success": true,
"data": [
["Nome", "Email", "Telefone", "Cidade"],
["José Silva", "jose@email.com", "11987654321", "São Paulo"],
["Maria Santos", "maria@email.com", "11976543210", "Rio de Janeiro"]
],
"rowCount": 3
}
Boas Práticas
✅ SIM:
- Sempre especifique o range exato para evitar leitura desnecessária de dados
- Use ranges nomeados (ex: "Clientes!A:D") para melhor organização
- Armazene tokens OAuth2 de forma segura (variáveis de ambiente)
- Trate erros de autenticação e permissão adequadamente
- Use a primeira linha como cabeçalho e comece leitura de dados em A2
- Limite o range para melhorar performance (evite A:Z em planilhas grandes)
❌ NÃO:
- Não exponha accessToken ou refreshToken em logs
- Não use range muito amplo se precisa de poucos dados
- Não esqueça de renovar tokens expirados
- Não presuma que a planilha tem dados - sempre verifique rowCount
- Não faça múltiplas leituras se pode ler tudo de uma vez
Dicas
💡 Dica 1 - Range Notation: Use notação A1 corretamente:
- A1:B10 = células específicas
- A:A = coluna inteira
- 1:1 = linha inteira
- Sheet1!A1:B10 = especifica a aba
💡 Dica 2 - OAuth Setup: Para configurar OAuth2 Google Sheets: 1. Acesse Google Cloud Console 2. Ative Google Sheets API 3. Crie credenciais OAuth 2.0 4. Configure redirect URI 5. Obtenha Client ID e Client Secret 6. Use fluxo OAuth2 para obter tokens
💡 Dica 3 - Performance: Para planilhas grandes:
- Leia apenas as colunas necessárias: A:C ao invés de A:Z
- Use range limitado: A1:C100 ao invés de A:C
- Cache os resultados em variáveis se usar múltiplas vezes
💡 Dica 4 - Estrutura de Dados: O retorno é array de arrays:
data[0][0] = primeira linha, primeira coluna
data[1][2] = segunda linha, terceira coluna
💡 Dica 5 - Permissões: A conta Google usada precisa ter permissão de "Visualizar" ou superior na planilha.
Próximo Node
→ SHEETS_WRITE - Escrever dados na planilha → SHEETS_APPEND - Adicionar linhas ao final → SHEETS_CLEAR - Limpar range de células