← Blog

Como integrar WhatsApp com Google Sheets

Planilhas Google são a ferramenta de automação mais subestimada do mundo corporativo brasileiro. Times de vendas, operações e atendimento já vivem no Google Sheets — e quando precisam enviar mensagens WhatsApp, muitos ainda copiam telefones manualmente para o celular. Com Google Apps Script e uma API REST como a do Zapixo, você transforma qualquer planilha em um painel de disparo controlado, sem instalar nada além do que já usa no dia a dia.

Neste tutorial, vamos construir uma integração completa: planilha com colunas de controle, script que lê as linhas pendentes, envia mensagens via API e registra o status de cada envio. Ao final, você terá um sistema funcional para notificações, cobranças e confirmações — tudo a partir de uma planilha.

O que vamos construir

Uma planilha com esta estrutura:

| Nome | Telefone | Mensagem | Status | Enviado em | Message ID | |------|----------|----------|--------|------------|------------| | Maria Silva | 5511999999999 | Olá Maria, seu pedido saiu! | pendente | | | | João Santos | 5511988888888 | Boleto vence amanhã | pendente | | |

Um menu WhatsApp Zapixo com a opção "Enviar pendentes" que:

  1. Lê linhas com status pendente.
  2. Envia cada mensagem via API do Zapixo.
  3. Atualiza status para enviado ou erro.
  4. Registra timestamp e messageId de cada disparo.

Essa abordagem é especialmente útil para equipes que já gerenciam listas de clientes, pedidos ou cobranças em planilhas e querem adicionar WhatsApp sem migrar para outra ferramenta.

Pré-requisitos

Antes de começar, certifique-se de ter:

  • Conta Google com acesso ao Google Sheets.
  • Conta no Zapixo com instância WhatsApp conectada via QR code.
  • Chave API gerada em Painel → Chaves API (formato zpx_...).
  • Nome da instância configurada (ex: minha-planilha).

Dica sobre telefones: use formato internacional sem símbolos — 5511999999999 (código do país + DDD + número com nono dígito). O script remove caracteres não numéricos, mas inserir corretamente evita erros.

Passo 1: criar a planilha

  1. Acesse sheets.google.com e crie uma nova planilha.
  2. Na primeira linha, adicione os cabeçalhos: Nome, Telefone, Mensagem, Status, Enviado em, Message ID.
  3. Preencha algumas linhas de teste com seu próprio número.
  4. Defina o status inicial como pendente para as linhas que deseja enviar.

Você pode formatar a coluna Status com validação de dados (menu suspenso com opções: pendente, enviado, erro) para evitar digitação incorreta.

Passo 2: Abrir o Apps Script

  1. No menu: Extensões → Apps Script
  2. Apague o código padrão
  3. Cole o script abaixo

Passo 3: Script completo

const ZAPIXO_API_KEY = "zpx_SUA_CHAVE_AQUI";
const ZAPIXO_INSTANCE = "minha-planilha";
const ZAPIXO_URL = "https://zapixo.com.br/api/v1/messages/text";

function enviarWhatsApp(telefone, mensagem) {
  const payload = {
    instance: ZAPIXO_INSTANCE,
    number: String(telefone).replace(/\D/g, ""),
    text: mensagem,
  };

  const options = {
    method: "post",
    headers: {
      Authorization: "Bearer " + ZAPIXO_API_KEY,
      "Content-Type": "application/json",
    },
    payload: JSON.stringify(payload),
    muteHttpExceptions: true,
  };

  const response = UrlFetchApp.fetch(ZAPIXO_URL, options);
  const code = response.getResponseCode();
  const body = JSON.parse(response.getContentText());

  if (code !== 200) {
    throw new Error("Erro " + code + ": " + JSON.stringify(body));
  }

  return body;
}

function enviarPendentes() {
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  const data = sheet.getDataRange().getValues();
  const headers = data[0];

  const colTelefone = headers.indexOf("Telefone");
  const colStatus = headers.indexOf("Status");
  const colMensagem = headers.indexOf("Mensagem");

  if (colTelefone === -1 || colStatus === -1 || colMensagem === -1) {
    SpreadsheetApp.getUi().alert("Colunas Telefone, Status e Mensagem são obrigatórias.");
    return;
  }

  let enviados = 0;
  let erros = 0;

  for (let i = 1; i < data.length; i++) {
    const row = data[i];
    const status = row[colStatus];

    if (status !== "pendente") continue;

    const telefone = row[colTelefone];
    const mensagem = row[colMensagem];

    try {
      enviarWhatsApp(telefone, mensagem);
      sheet.getRange(i + 1, colStatus + 1).setValue("enviado");
      enviados++;

      // Respeitar rate limit (60/min) — pausa de 1 segundo
      Utilities.sleep(1000);
    } catch (err) {
      sheet.getRange(i + 1, colStatus + 1).setValue("erro");
      erros++;
      Logger.log("Erro linha " + (i + 1) + ": " + err.message);
    }
  }

  SpreadsheetApp.getUi().alert(
    "Concluído! Enviados: " + enviados + " | Erros: " + erros
  );
}

function onOpen() {
  SpreadsheetApp.getUi()
    .createMenu("WhatsApp Zapixo")
    .addItem("Enviar pendentes", "enviarPendentes")
    .addToUi();
}

Passo 4: configurar e testar

  1. Substitua ZAPIXO_API_KEY e ZAPIXO_INSTANCE pelos seus valores reais.
  2. Salve o projeto (Ctrl+S) e dê um nome ao projeto Apps Script.
  3. Execute a função onOpen uma vez para criar o menu (selecione no dropdown e clique ▶).
  4. O Google pedirá autorização — aceite as permissões de acesso à planilha e requisições externas (UrlFetchApp).
  5. Recarregue a planilha — o menu WhatsApp Zapixo aparecerá na barra superior.
  6. Adicione uma linha de teste com seu número e status pendente.
  7. Clique em WhatsApp Zapixo → Enviar pendentes e verifique se a mensagem chegou.

Se receber erro 401, verifique a chave API. Erro 404 indica instância inexistente ou nome incorreto. Erro 429 significa rate limit — aguarde um minuto e tente novamente.

Personalizando mensagens com nome

Use template literals no Apps Script:

const nome = row[headers.indexOf("Nome")];
const mensagem = `Olá ${nome}! ${row[colMensagem]}`;

Ou monte a mensagem diretamente na coluna Mensagem da planilha com fórmulas:

="Olá "&A2&"! Seu pedido saiu para entrega."

Trigger automático (opcional)

Para enviar automaticamente quando uma linha é adicionada:

function onEdit(e) {
  // Cuidado: pode disparar em loop — use com moderação
  const range = e.range;
  if (range.getColumn() === 4 && range.getRow() > 1) {
    // Coluna Status alterada para "pendente"
    if (range.getValue() === "pendente") {
      enviarPendentes();
    }
  }
}

Triggers automáticos em planilhas compartilhadas exigem cuidado com rate limit e loops infinitos.

Agendando envios automáticos

Para disparar em horário fixo (ex: todo dia às 9h), configure um trigger temporal:

  1. No Apps Script, clique no ícone de Triggers (relógio) na barra lateral.
  2. Adicionar trigger → função enviarPendentes → evento baseado em tempo → timer diário → 9h–10h.
  3. O Google executará automaticamente, desde que haja linhas com status pendente.

Essa abordagem funciona bem para lembretes diários de consultas, confirmações de pedidos ou cobranças recorrentes. Lembre-se de que triggers automáticos rodam na conta do proprietário do script — se a planilha for compartilhada, o dono da conta precisa configurar o trigger.

Limitações do Apps Script

  • Quota UrlFetchApp: 20.000 chamadas/dia (conta gratuita)
  • Timeout: 6 minutos por execução
  • Rate limit Zapixo: 60 req/min — use Utilities.sleep(1000) entre envios
  • Sem webhook nativo: receber mensagens exige servidor externo

Para volumes maiores ou recebimento de mensagens, migre para n8n, Node.js ou Python.

Segurança da API key

Nunca compartilhe a planilha publicamente com a API key no script. Opções mais seguras:

  1. Use PropertiesService para armazenar a key:
function setApiKey() {
  PropertiesService.getScriptProperties().setProperty("ZAPIXO_KEY", "zpx_...");
}

function getApiKey() {
  return PropertiesService.getScriptProperties().getProperty("ZAPIXO_KEY");
}
  1. Restrinja acesso à planilha apenas para usuários autorizados

Casos de uso reais

Cobrança — exporte inadimplentes do ERP para a planilha, gere mensagens com fórmula incluindo valor e vencimento, dispare com um clique no menu Zapixo.

Confirmação de eventos — lista de inscritos com telefone e mensagem personalizada de confirmação. Após o evento, envie pesquisa de satisfação.

Operações de campo — equipe preenche telefones no celular via app Google Sheets, escritório dispara mensagens em lote no horário comercial.

Agências de marketing — envie relatórios semanais de performance para cada cliente da base, com dados extraídos de outras planilhas via IMPORTRANGE.

RH e recrutamento — lembre candidatos de entrevistas agendadas, envie feedback após processos seletivos.

Para todos esses casos, lembre-se da regra de ouro: só envie para quem autorizou receber mensagens (opt-in). Planilhas facilitam o disparo, mas não substituem consentimento.

Alternativas

Se a planilha não escala, considere:

  • n8n — automação visual com trigger Google Sheets
  • Make (Integromat) — similar ao n8n
  • Zapier — mais caro, interface em inglês

O Zapixo funciona com todas via HTTP Request. Veja nossos guias de integração em zapixo.com.br/integracao/planilha-google.

Boas práticas para disparo via planilha

Mesmo com a simplicidade do Google Sheets, algumas práticas evitam problemas:

  • Não envie mais de 200–300 mensagens/dia de um número novo — siga o aquecimento gradual.
  • Personalize cada mensagem com nome e contexto, evitando texto idêntico em massa.
  • Use intervalos entre envios — o script já inclui Utilities.sleep(1000), mas para volumes maiores aumente para 3–5 segundos.
  • Monitore a coluna Status — linhas com erro precisam de investigação antes de reenvio.
  • Mantenha backup da planilha e exporte periodicamente.

Conclusão

Integrar WhatsApp com Google Sheets via Apps Script e a API do Zapixo é uma das formas mais acessíveis de começar com automação de mensagens. Sem servidor, sem deploy, sem framework — apenas uma planilha, um script e uma chave API. Você paga via Pix, conecta a instância em minutos e dispara mensagens personalizadas com um clique.

Quando o volume crescer além das cotas do Apps Script, a mesma API do Zapixo escala para n8n, Python, Node.js ou qualquer outra ferramenta da sua stack — sem precisar mudar de provedor. Crie sua conta em zapixo.com.br, copie o código deste tutorial e envie sua primeira mensagem a partir de uma planilha em menos de 15 minutos.