Sim: dá para enviar e-mails automáticos pelo Google Sheets usando Google Apps Script, sem contratar uma plataforma de automação. A planilha funciona como uma fila simples de contatos, enquanto o script lê cada linha, monta a mensagem e registra quando o envio termina.
Esse fluxo serve para avisos de vencimento, confirmação de cadastro, retorno de orçamento, lembretes internos e outras tarefas repetitivas. Ele é barato e relativamente fácil de manter, mas não deve ser tratado como uma ferramenta de disparo em massa: existem limites de cota, regras contra abuso e cuidados importantes para não enviar a mesma mensagem duas vezes.

Como funciona a automação
Imagine uma tabela chamada Contatos com as colunas Nome, Email, Mensagem, Status e Enviado em. Cada linha representa uma tarefa. Quando o script encontra uma linha com endereço preenchido e Status diferente de “Enviado”, ele chama o serviço MailApp, envia o e-mail e grava o resultado na própria planilha.
O Apps Script é uma plataforma de JavaScript integrada aos serviços do Google. No Sheets, ele consegue ler e editar células, trabalhar com os dados em forma de matrizes e conversar com outros produtos, como Gmail, Drive e Calendar. O serviço MailApp é voltado ao envio: ele não dá acesso à caixa de entrada do Gmail.
Esse modelo é diferente de uma API completa. Você não precisa criar servidor, banco de dados ou tela de administração, mas também não ganha filas avançadas, métricas de campanha, gestão de descadastros ou alta capacidade de entrega.
Prepare a planilha
Crie uma aba chamada Contatos e use esta primeira linha como cabeçalho:
| Nome | Mensagem | Status | Enviado em | |
|---|---|---|---|---|
| Ana | ana@exemplo.com | Seu orçamento está pronto. | Pendente | |
| Bruno | bruno@exemplo.com | Seu cadastro foi recebido. | Pendente |
O valor de Status é o que impede o reenvio. Use “Pendente” para uma mensagem que ainda precisa sair, “Enviado” quando o script concluir e, se quiser, “Erro” para revisar manualmente uma linha que falhou. Evite alterar a ordem ou o nome dos cabeçalhos depois de colocar o código em produção.
Crie o script de envio
Na planilha, abra Extensões > Apps Script, apague o conteúdo inicial e cole o código abaixo. Ele usa a linha de cabeçalho para localizar as colunas, escapa caracteres que poderiam quebrar o HTML e só muda o status depois que o Google aceita o envio.
function enviarEmailsPendentes() {
const planilha = SpreadsheetApp.getActiveSpreadsheet();
const aba = planilha.getSheetByName('Contatos');
if (!aba) throw new Error('A aba Contatos não existe.');
const valores = aba.getDataRange().getValues();
if (valores.length < 2) return;
const cabecalho = valores[0].map(String);
const coluna = nome => cabecalho.indexOf(nome);
const nomeCol = coluna('Nome');
const emailCol = coluna('Email');
const mensagemCol = coluna('Mensagem');
const statusCol = coluna('Status');
const enviadoCol = coluna('Enviado em');
if ([nomeCol, emailCol, mensagemCol, statusCol].includes(-1)) {
throw new Error('Confira os cabeçalhos Nome, Email, Mensagem e Status.');
}
const escapar = valor => String(valor)
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
for (let i = 1; i < valores.length; i++) {
const linha = valores[i];
const nome = String(linha[nomeCol] || '').trim();
const email = String(linha[emailCol] || '').trim();
const mensagem = String(linha[mensagemCol] || '').trim();
const status = String(linha[statusCol] || '').trim().toLowerCase();
if (!email || !mensagem || status === 'enviado') continue;
const assunto = `Atualização para ${nome || 'você'}`;
const texto = `Olá${nome ? `, ${nome}` : ''}!\n\n${mensagem}`;
const html = `<p>Olá${nome ? `, ${escapar(nome)}` : ''}!</p>
<p>${escapar(mensagem).replace(/\n/g, '<br>')}</p>`;
MailApp.sendEmail({
to: email,
subject: assunto,
body: texto,
htmlBody: html
});
aba.getRange(i + 1, statusCol + 1).setValue('Enviado');
if (enviadoCol !== -1) {
aba.getRange(i + 1, enviadoCol + 1).setValue(new Date());
}
}
}
O código é propositalmente conservador: ele não tenta enviar para linhas sem e-mail ou sem mensagem e não toca em uma linha que já esteja com status “Enviado”. Se uma chamada falhar, a linha não recebe esse status e pode ser corrigida antes de uma nova tentativa.
Autorize e faça o primeiro teste
Salve o projeto com um nome fácil de reconhecer e execute enviarEmailsPendentes pelo editor. Na primeira execução, o Google vai pedir autorização para que o script leia a planilha e envie mensagens em seu nome. Esse pedido é esperado; confira o usuário e o projeto antes de aceitar.
Para testar sem risco, deixe apenas uma linha com seu próprio endereço e um texto curto. Depois de executar, confirme três coisas: o e-mail chegou, o Status virou “Enviado” e a data apareceu na coluna Enviado em. Só então coloque outros destinatários na fila.
Se a mensagem não chegar, procure primeiro em Spam, confira o endereço e veja o histórico de execuções no Apps Script. Um erro durante o envio também pode indicar que a conta atingiu a cota diária ou que o corpo da mensagem ficou grande demais.
Como enviar automaticamente em um horário
Para não depender de uma execução manual, crie um gatilho instalável. No editor do Apps Script, abra o menu de Acionadores, clique em Adicionar acionador, escolha a função enviarEmailsPendentes, selecione Baseado em tempo e defina uma frequência, como a cada 15 minutos ou uma vez por dia.
O gatilho baseado em tempo funciona como uma tarefa agendada. Ele pode executar a função em intervalos, mas o horário exato pode sofrer pequena variação. Como o gatilho roda com a autorização da conta que o criou, o envio sai dessa conta mesmo que outra pessoa edite a planilha.
Um acionador de edição também pode parecer tentador, mas há uma pegadinha: edições feitas por outro script ou por uma chamada de API não disparam os gatilhos de edição da mesma forma. Para uma fila previsível, o gatilho baseado em tempo costuma ser mais simples de explicar e monitorar.
Limites que você precisa conhecer
As cotas do Apps Script são diárias, por usuário, e variam conforme o tipo de conta. Na página oficial consultada em 20 de agosto de 2026, o Google lista 100 destinatários por dia para contas de consumidor e 1.500 por dia para contas Google Workspace, além de um limite de 50 destinatários por mensagem. Esses números podem mudar sem aviso e algumas contas ou domínios podem ter condições diferentes.
O mesmo documento informa limite de seis minutos por execução. Em outras palavras, esse script é adequado para pequenas filas e avisos operacionais, não para uma newsletter com milhares de contatos. Dividir o trabalho em vários gatilhos não é uma forma segura de contornar cotas: a limitação continua associada ao usuário e ao serviço.
Se a necessidade crescer, procure uma ferramenta de e-mail transacional ou uma plataforma de automação com consentimento, descadastro, controle de reputação e relatórios. O Sheets pode continuar sendo a origem dos dados, mas não precisa carregar sozinho toda a responsabilidade pelo disparo.
Cuidados para não transformar a automação em problema
- Peça consentimento: envie mensagens apenas para pessoas que esperam aquele contato.
- Evite dados sensíveis: não coloque informações clínicas, financeiras ou documentos completos em uma planilha compartilhada sem controles adequados.
- Proteja a aba: restrinja quem pode editar a coluna Status e o endereço dos destinatários.
- Use uma trava em cenários concorrentes: se vários gatilhos puderem rodar ao mesmo tempo, avalie
LockServicepara impedir duas execuções sobre a mesma fila. - Registre erros: uma coluna de observação ou o histórico de execuções ajuda a descobrir por que uma linha ficou pendente.
Se você quiser avançar para uma integração que receba dados de outros sistemas, o JSMS também mostra como criar uma API simples com Google Apps Script e Google Sheets. A lógica é parecida, mas o fluxo começa com uma requisição HTTP em vez de uma linha já existente na planilha.
Perguntas frequentes
Preciso pagar para usar o Apps Script?
O Apps Script faz parte do ecossistema Google e pode ser usado com contas de consumidor e Google Workspace, mas os serviços têm cotas. O fato de o editor estar disponível não significa que o envio seja ilimitado.
Posso usar o GmailApp no lugar do MailApp?
Pode, mas o GmailApp tem acesso a recursos da caixa de entrada. Para um fluxo que apenas envia mensagens, o MailApp é mais restrito e costuma ser suficiente.
Como evitar que o mesmo e-mail seja enviado duas vezes?
Grave um status depois do envio e faça o script ignorar linhas marcadas como “Enviado”. Em filas mais críticas, use também uma trava e uma coluna com identificador único.
Esse método serve para marketing em massa?
Não é a melhor escolha. Para poucos avisos operacionais, ele funciona bem; para campanhas, prefira uma solução com consentimento, descadastro, métricas e gestão de reputação.