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:
- Lê linhas com status
pendente. - Envia cada mensagem via API do Zapixo.
- Atualiza status para
enviadoouerro. - Registra timestamp e
messageIdde 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
- Acesse sheets.google.com e crie uma nova planilha.
- Na primeira linha, adicione os cabeçalhos:
Nome,Telefone,Mensagem,Status,Enviado em,Message ID. - Preencha algumas linhas de teste com seu próprio número.
- Defina o status inicial como
pendentepara 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
- No menu: Extensões → Apps Script
- Apague o código padrão
- 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
- Substitua
ZAPIXO_API_KEYeZAPIXO_INSTANCEpelos seus valores reais. - Salve o projeto (Ctrl+S) e dê um nome ao projeto Apps Script.
- Execute a função
onOpenuma vez para criar o menu (selecione no dropdown e clique ▶). - O Google pedirá autorização — aceite as permissões de acesso à planilha e requisições externas (
UrlFetchApp). - Recarregue a planilha — o menu WhatsApp Zapixo aparecerá na barra superior.
- Adicione uma linha de teste com seu número e status
pendente. - 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:
- No Apps Script, clique no ícone de Triggers (relógio) na barra lateral.
- Adicionar trigger → função
enviarPendentes→ evento baseado em tempo → timer diário → 9h–10h. - 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:
- Use PropertiesService para armazenar a key:
function setApiKey() {
PropertiesService.getScriptProperties().setProperty("ZAPIXO_KEY", "zpx_...");
}
function getApiKey() {
return PropertiesService.getScriptProperties().getProperty("ZAPIXO_KEY");
}
- 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
erroprecisam 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.