É possível enviar e-mails automáticos a partir de uma lista do Google Planilhas sem instalar outro programa: basta combinar uma planilha com o Google Apps Script e o serviço de envio do Gmail. O script lê cada linha, monta a mensagem e registra quais contatos já receberam o e-mail.
Este tutorial mostra um fluxo pequeno, mas útil para avisos internos, confirmações, lembretes e contatos que autorizaram receber sua comunicação. Ele não substitui uma ferramenta de disparo em massa: há limites de cota, o envio sai da conta que autorizou o script e você continua responsável por trabalhar com uma lista legítima.

O que você vai montar
O fluxo tem três peças:
- Google Planilhas: guarda nome, endereço e situação de cada contato;
- Apps Script: é o código JavaScript hospedado pelo Google que lê a planilha;
- MailApp: serviço do Apps Script que envia o e-mail.
Para este caso, o MailApp é suficiente porque sua função é enviar mensagens. O GmailApp é mais amplo: também acessa conversas, rascunhos e marcadores do Gmail. Quanto menos acesso o script pedir, mais fácil fica entender o que ele realmente faz.
1. Prepare a planilha
Crie uma planilha nova, renomeie a primeira aba para Contatos e use esta primeira linha:
| Nome | Status | |
|---|---|---|
| Ana | ana@exemplo.com | |
| Bruno | bruno@exemplo.com |
Comece com seu próprio endereço ou com duas pessoas que aceitaram o teste. Deixe a coluna Status vazia nos contatos que ainda não receberam a mensagem. Depois do envio, o código escreverá Enviado nessa célula.
2. Cole o código do Apps Script
Na planilha, abra Extensões > Apps Script, apague o conteúdo inicial e cole:
const ABA = 'Contatos';
const COLUNA_NOME = 1;
const COLUNA_EMAIL = 2;
const COLUNA_STATUS = 3;
function enviarEmails() {
const planilha = SpreadsheetApp.getActiveSpreadsheet();
const aba = planilha.getSheetByName(ABA);
if (!aba) {
throw new Error(`A aba "${ABA}" não foi encontrada.`);
}
const ultimaLinha = aba.getLastRow();
if (ultimaLinha < 2) return;
const linhas = aba.getRange(2, 1, ultimaLinha - 1, 3).getValues();
linhas.forEach((linha, indice) => {
const nome = String(linha[COLUNA_NOME - 1]).trim();
const email = String(linha[COLUNA_EMAIL - 1]).trim();
const status = String(linha[COLUNA_STATUS - 1]).trim().toLowerCase();
if (!nome || !email || status === 'enviado') return;
if (!/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {
aba.getRange(indice + 2, COLUNA_STATUS).setValue('E-mail inválido');
return;
}
const assunto = 'Uma mensagem para você';
const corpo = `Olá, ${nome}!\n\nEsta é uma mensagem enviada a partir de uma planilha.\n\nAté mais.`;
MailApp.sendEmail(email, assunto, corpo);
aba.getRange(indice + 2, COLUNA_STATUS).setValue('Enviado');
});
}
O código ignora a linha de títulos, pula linhas já marcadas como enviadas e identifica endereços obviamente inválidos. A validação não confirma se a caixa de entrada existe; ela apenas evita que um erro simples consuma uma tentativa de envio.
3. Autorize e faça o primeiro teste
- Clique em Salvar no editor do Apps Script.
- Na lista de funções, selecione
enviarEmails. - Clique em Executar.
- Na primeira execução, revise as permissões solicitadas e autorize o projeto.
- Abra a planilha e confira se a linha de teste passou para
Enviado.
Se a mensagem não chegar imediatamente, confira também spam, promoções e o endereço digitado. Na área Execuções do Apps Script, você encontra o resultado de cada tentativa. Só marque o restante da lista depois que o teste funcionar.
4. Faça o script rodar sozinho
Para transformar o envio manual em rotina, crie um acionador instalável:
- No editor, clique no ícone de Acionadores (relógio).
- Selecione Adicionar acionador.
- Escolha a função
enviarEmails. - Em origem do evento, selecione Baseado no tempo.
- Escolha uma frequência, como uma vez por dia, e salve.
Segundo a documentação do Google, acionadores instaláveis podem chamar serviços que exigem autorização. Eles sempre rodam na conta de quem criou o acionador. O horário também não é um despertador exato: em acionadores recorrentes, o Apps Script pode escolher um momento dentro da janela configurada e manter esse horário aproximado nos dias seguintes.
Por que o status é tão importante?
Sem uma trava, cada execução percorreria a lista e enviaria tudo de novo. A condição status === 'enviado' transforma a planilha em um registro simples do que já foi processado. Se quiser reenviar uma mensagem, apague o status daquela linha de propósito e faça isso sabendo que o próximo acionamento a tratará como pendente.
Em um fluxo mais organizado, você pode trocar o status por colunas como Data do envio, Campanha e Erro. Se a automação crescer para várias etapas e serviços, vale comparar este caminho com uma ferramenta visual como o workflow de webhook no n8n.
Limites que você precisa conhecer
As cotas do Apps Script variam conforme o tipo de conta e podem mudar sem aviso. Na consulta feita em 26 de agosto de 2026, a página oficial listava:
- 100 destinatários por dia para contas de consumidor, como
gmail.com; - 1.500 destinatários por dia para contas do Google Workspace;
- até 50 destinatários por mensagem;
- até seis minutos por execução;
- no máximo 20 acionadores por usuário e por script.
Esses números são cotas do serviço, não uma promessa de entrega na caixa de entrada. Se o limite for atingido, a execução pode lançar uma exceção e parar. Para listas grandes, campanhas, descadastramento, métricas e controle de reputação, use uma plataforma apropriada em vez de forçar uma conta pessoal.
Erros comuns e como corrigir
“A aba Contatos não foi encontrada”
O nome precisa ser exatamente Contatos, incluindo maiúsculas e sem espaço extra. Se preferir outro nome, altere o valor da constante ABA.
O script envia repetido
Verifique se a terceira coluna está realmente sendo preenchida com Enviado. Também confira se você não criou dois acionadores para a mesma função. Apague o duplicado no menu de acionadores.
O envio para no meio da lista
Veja a mensagem na área de execuções. Cota excedida, endereço inválido ou tempo máximo são causas comuns. Como o status é gravado depois do envio, uma falha entre essas duas operações pode exigir uma conferência manual para evitar reenvio.
Quero enviar HTML ou anexos
O método com três argumentos usado aqui envia texto simples, que é a opção mais previsível para começar. O MailApp.sendEmail também aceita opções, como htmlBody e anexos, mas adicione esses recursos apenas depois de validar o fluxo básico.
Conclusão
Para poucos avisos e uma rotina controlada, Google Planilhas com Apps Script resolve o problema com pouco código e sem servidor próprio. A combinação fica especialmente interessante quando a lista já nasce em uma planilha e você precisa apenas transformar linhas pendentes em mensagens.
O ponto de atenção é não confundir automação simples com plataforma de e-mail marketing. Teste com poucos destinatários, mantenha o status atualizado, respeite consentimento e acompanhe as cotas antes de colocar o acionador para funcionar todos os dias.
Perguntas frequentes
Posso usar uma conta Gmail comum?
Sim. A documentação do Apps Script diferencia as cotas de contas de consumidor e do Google Workspace; a conta comum tem limite diário menor.
O e-mail sai de qual endereço?
Ele é enviado pela conta que autorizou e criou o acionador. Por isso, revise a conta ativa antes de configurar a automação.
O Apps Script envia o e-mail exatamente no horário escolhido?
Não necessariamente. Acionadores baseados no tempo podem executar dentro de uma janela aproximada, e não como um relógio exato.
Como evitar que a mesma pessoa receba a mensagem duas vezes?
Use uma coluna de status e marque a linha como Enviado depois do envio. O script deste tutorial ignora linhas com esse status.
Fontes consultadas
- Google for Developers: classe MailApp — envio, quota restante e opções da mensagem.
- Google for Developers: classe GmailApp — diferença entre enviar e acessar dados do Gmail.
- Google for Developers: cotas dos serviços — limites consultados em 26/08/2026.
- Google for Developers: acionadores instaláveis — autorização, conta executora e acionadores por tempo.