Pular para conteúdo

AIRTABLE BATCH UPDATE - Atualizar Múltiplos Registros no Airtable

O que é este Node?

O AIRTABLE BATCH UPDATE é o node responsável por atualizar múltiplos registros de uma só vez no Airtable de forma eficiente.

Por que este Node existe?

Atualizar múltiplos registros individualmente é lento e ineficiente. O AIRTABLE BATCH UPDATE existe para:

  1. Performance: Atualizar vários registros em uma única requisição API
  2. Atualização em Massa: Modificar status de múltiplos registros simultaneamente
  3. Eficiência: Reduzir número de chamadas à API do Airtable
  4. Sincronização em Lote: Atualizar múltiplos registros após processamento

Como funciona internamente?

Quando o AIRTABLE BATCH UPDATE é executado, o sistema:

  1. Coleta Credenciais: Obtém API Key, Base ID e nome da tabela
  2. Prepara Array: Processa array de registros com IDs e campos
  3. Valida IDs: Cada registro deve ter id e fields
  4. Faz Requisição PATCH: Envia todos os registros em batch
  5. Se falha: Lança erro (ID inválido ou dados incorretos)
  6. Se sucesso: Armazena array com todos os registros atualizados
  7. Continua Execução: Passa para próximo node com resultados

Código interno (airtable.executor.ts:79-84):

case 'batchUpdate': {
  const records = JSON.parse(this.replaceVariables(JSON.stringify(node.data.records), context.variables));
  const response = await axios.patch(baseUrl, { records }, { headers });
  result = response.data;
  break;
}

Quando você DEVE usar este Node?

Use AIRTABLE BATCH UPDATE sempre que precisar de atualizar múltiplos registros:

Casos de uso

  1. Atualização em Massa: "Marcar múltiplos tickets como resolvidos"
  2. Sincronização: "Atualizar status de vários pedidos após processamento"
  3. Processamento em Lote: "Atualizar múltiplos leads após campanha"
  4. Mudança de Estado: "Alterar categoria de vários produtos simultaneamente"

Quando NÃO usar AIRTABLE BATCH UPDATE

  • Um único registro: Use AIRTABLE UPDATE ao invés
  • Mais de 10 registros: API do Airtable limita a 10 por requisição

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Deve ser "batchUpdate"
config.apiKey string Sim Token de autenticação do Airtable
config.baseId string Sim ID da base do Airtable
config.tableName string Sim Nome da tabela
records array Sim Array de objetos com id e fields (máx 10)
responseVariable string Não Nome da variável de resposta (padrão: "airtableResult")

Exemplo 1: Marcar Tickets como Resolvidos

Objetivo: Atualizar status de múltiplos tickets de uma vez

JSON para Importar

{
  "name": "Resolver Tickets em Lote",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "airtable_1",
      "type": "airtable",
      "position": { "x": 250, "y": 100 },
      "data": {
        "label": "Buscar Tickets Pendentes",
        "operation": "search",
        "config": {
          "apiKey": "patABC123456789xyz",
          "baseId": "appXYZ123456",
          "tableName": "Tickets"
        },
        "filterFormula": "{Status} = 'Pendente'",
        "maxRecords": 10,
        "responseVariable": "ticketsPendentes"
      }
    },
    {
      "id": "formatter_1",
      "type": "formatter",
      "position": { "x": 400, "y": 100 },
      "data": {
        "label": "Preparar Updates",
        "parameters": {
          "template": "{{#each ticketsPendentes.records}}{\"id\": \"{{this.id}}\", \"fields\": {\"Status\": \"Resolvido\", \"DataResolucao\": \"{{hoje}}\"}}{{#unless @last}},{{/unless}}{{/each}}",
          "resultVariable": "recordsParaAtualizar"
        }
      }
    },
    {
      "id": "airtable_2",
      "type": "airtable",
      "position": { "x": 550, "y": 100 },
      "data": {
        "label": "Atualizar em Lote",
        "operation": "batchUpdate",
        "config": {
          "apiKey": "patABC123456789xyz",
          "baseId": "appXYZ123456",
          "tableName": "Tickets"
        },
        "records": "{{recordsParaAtualizar}}",
        "responseVariable": "ticketsAtualizados"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "✅ {{ticketsAtualizados.records.length}} tickets marcados como resolvidos!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 850, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "airtable_1" },
    { "source": "airtable_1", "target": "formatter_1" },
    { "source": "formatter_1", "target": "airtable_2" },
    { "source": "airtable_2", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: ✅ 5 tickets marcados como resolvidos!

Exemplo 2: Atualizar Múltiplos Leads

Objetivo: Atualizar categoria de vários leads após campanha

JSON para Importar

{
  "name": "Atualizar Leads Campanha",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "variable_1",
      "type": "variable",
      "position": { "x": 250, "y": 100 },
      "data": {
        "label": "Definir IDs",
        "parameters": {
          "name": "idsLeads",
          "value": "[\"recLEAD001\", \"recLEAD002\", \"recLEAD003\"]"
        }
      }
    },
    {
      "id": "airtable_1",
      "type": "airtable",
      "position": { "x": 400, "y": 100 },
      "data": {
        "label": "Atualizar Leads",
        "operation": "batchUpdate",
        "config": {
          "apiKey": "patABC123456789xyz",
          "baseId": "appXYZ123456",
          "tableName": "Leads"
        },
        "records": [
          {
            "id": "recLEAD001",
            "fields": {
              "Campanha": "Black Friday 2025",
              "Status": "Contatado",
              "UltimaInteracao": "{{hoje}}"
            }
          },
          {
            "id": "recLEAD002",
            "fields": {
              "Campanha": "Black Friday 2025",
              "Status": "Contatado",
              "UltimaInteracao": "{{hoje}}"
            }
          },
          {
            "id": "recLEAD003",
            "fields": {
              "Campanha": "Black Friday 2025",
              "Status": "Contatado",
              "UltimaInteracao": "{{hoje}}"
            }
          }
        ],
        "responseVariable": "leadsAtualizados"
      }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 550, "y": 100 },
      "data": {
        "label": "Confirmar",
        "parameters": {
          "message": "Leads atualizados para campanha Black Friday!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 700, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "variable_1" },
    { "source": "variable_1", "target": "airtable_1" },
    { "source": "airtable_1", "target": "message_1" },
    { "source": "message_1", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: Leads atualizados para campanha Black Friday!

Resposta do Node

{
  "records": [
    {
      "id": "recABC123",
      "createdTime": "2025-01-14T10:00:00.000Z",
      "fields": {
        "Nome": "João Silva",
        "Status": "Resolvido",
        "DataResolucao": "2025-01-15"
      }
    },
    {
      "id": "recDEF456",
      "createdTime": "2025-01-14T11:00:00.000Z",
      "fields": {
        "Nome": "Maria Santos",
        "Status": "Resolvido",
        "DataResolucao": "2025-01-15"
      }
    }
  ]
}

Boas Práticas

SIM:

  • Limite a 10 registros por batch (limite da API Airtable)
  • Cada registro deve ter id (obrigatório) e fields (campos a atualizar)
  • Use SEARCH antes para obter IDs dos registros a atualizar
  • Combine com LOOP para processar resultados de busca

NÃO:

  • Não tente atualizar mais de 10 registros por vez
  • Não use BATCH UPDATE para 1 registro (use UPDATE normal)
  • Não esqueça o campo id em cada registro
  • Não envie campos que não precisa atualizar

Dicas

💡 Dica 1: Formato do array: [{id: "recXXX", fields: {campo: valor}}]

💡 Dica 2: API do Airtable limita a 10 registros - para mais, use LOOP

💡 Dica 3: Apenas campos em fields são atualizados - outros permanecem inalterados

💡 Dica 4: Combine SEARCH + FORMATTER + BATCH UPDATE para atualização em massa eficiente

💡 Dica 5: Operação é atômica - todos são atualizados ou nenhum

Próximo Node

AIRTABLE UPDATE - Atualizar registro único → AIRTABLE BATCH CREATE - Criar múltiplos registros → AIRTABLE SEARCH - Buscar registros para atualizar → LOOP - Processar array antes de atualizar