A rotina de quem administra mensalidades pode ser bem repetitiva: copiar dados, abrir o Word, transformar em PDF, mandar por e-mail… tudo isso consome um tempo precioso que poderia ser usado em tarefas mais estratégicas. A boa notícia é que dá para automatizar todo esse processo direto da planilha, sem complicação e de forma super prática.
Nesse artigo, utilizamos a planilha Controle de Mensalidade para demonstrar como criar uma automação que gera relatórios em PDF e dispara por e-mail em apenas alguns cliques.
Planilha Utilizada
Nesse artigo, utilizei a Planilha Controle de Mensalidade versão PRO, para mostrar como automatizar o envio de relatórios em PDF diretamente por e-mail. Essa ação não está na versão vendida, sendo uma melhoria desenvolvida apenas para este exemplo que você poderá implementar.
A Versão PRO só pode ser adquirida após a aquisição da versão mais simples, informada abaixo.
Por que automatizar tarefas repetitivas é essencial
O problema do processo manual
Se você ainda faz o velho processo de abrir a planilha, copiar os dados, colar no Word, gerar um PDF e depois enviar manualmente por e-mail, já percebeu o quanto isso é desgastante. Além de perder tempo, esse processo aumenta o risco de erros — um dado copiado errado, um relatório enviado com atraso ou até esquecido.
Agora, imagine que cada ciclo de mensalidade repete esse ritual. Multiplique isso por semanas ou meses… é como carregar peso extra numa mochila todos os dias. Uma hora, o cansaço chega.
Como a automação com planilhas economiza tempo
Automatizar significa justamente aliviar esse peso. Com apenas alguns cliques, você gera relatórios filtrados — do dia, da semana ou do mês — em PDF e os envia automaticamente por e-mail. É como ter um assistente digital que cuida dessas tarefas chatas para você, enquanto você foca no que realmente importa: analisar resultados e tomar decisões estratégicas.
Além da economia de tempo, há outro ganho importante: consistência. Quando a planilha cuida do processo, o relatório sai sempre no mesmo padrão, sem risco de esquecer informações.
Passo a passo da automação no Controle de Mensalidade
Gerando relatórios em PDF diretamente da planilha
A primeira grande melhoria está no menu personalizado criado dentro da planilha. Assim que você atualiza a página, um novo item aparece na barra de menus. Ao clicar, abre-se uma pequena janela (HTML) que permite escolher se deseja gerar relatórios dos pagamentos do dia, da semana ou do mês.
O mais interessante é que essa automação se baseia na coluna de data de pagamento, que serve de filtro para organizar as informações. Ou seja, basta escolher o período desejado que o relatório já é montado automaticamente, pronto para virar um PDF.
Enviando relatórios por e-mail de forma automática
A segunda parte dessa automação é ainda mais poderosa: o envio automático por e-mail.
Dentro do código, é possível pré-configurar o e-mail de destino. Assim, ao selecionar “Enviar por e-mail” no menu, a planilha dispara o PDF diretamente para a caixa de entrada escolhida, sem que você precise digitar nada.
Quer personalizar? Pode mudar o assunto e o corpo do e-mail no próprio código HTML. Dessa forma, o relatório chega com um texto padronizado e profissional, poupando tempo e garantindo consistência na comunicação.
Como implementar a automação na sua planilha
Configuração do Apps Script e HTML
Para que tudo funcione, utilizamos o Google Apps Script, que é a ferramenta de programação integrada ao Google Sheets. O processo é simples:
- Abra sua planilha e vá em Extensões > Apps Script.
- Apague o código padrão que aparece e cole o código em JavaScript disponibilizado.
- Adicione um novo arquivo do tipo HTML dentro do Apps Script.
- Copie e cole o código HTML que cria a interface do menu.
Código:
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu("📄 PDF de Pagamentos")
.addItem("Gerar PDF", "mostrarDialogo")
.addToUi();
}
function mostrarDialogo() {
const html = HtmlService.createHtmlOutputFromFile('pagina')
.setWidth(400)
.setHeight(400);
SpreadsheetApp.getUi().showModalDialog(html, 'Gerar PDF de Pagamentos');
}
function gerarPDF(periodo, acao, emailDestino) {
const aba = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Pagamentos");
const dados = aba.getDataRange().getValues();
const cabecalho = dados[0];
const hoje = new Date();
const resultado = [];
const indiceData = cabecalho.indexOf("Data Pagamento");
for (let i = 1; i < dados.length; i++) {
const linha = dados[i];
const dataPagamento = new Date(linha[indiceData]);
if (periodo === "dia" && mesmaData(dataPagamento, hoje)) {
resultado.push(linha);
} else if (periodo === "semana" && mesmaSemana(dataPagamento, hoje)) {
resultado.push(linha);
} else if (periodo === "mes" && mesmaMes(dataPagamento, hoje)) {
resultado.push(linha);
}
}
if (resultado.length === 0) {
throw new Error("Nenhum pagamento encontrado no período selecionado.");
}
// Criar planilha temporária
const tempPlanilha = SpreadsheetApp.create("PDF Temporário");
const tempAba = tempPlanilha.getActiveSheet();
tempAba.getRange(1, 1, 1, 7).setValues([cabecalho.slice(0, 7)]);
tempAba.getRange(2, 1, resultado.length, 7).setValues(resultado.map(l => l.slice(0, 7)));
// Aplica bordas em toda a tabela (A até G, cabeçalho + dados)
tempAba.getRange(1, 1, resultado.length + 1, 7).setBorder(true, true, true, true, true, true);
// Ajustar largura automática das colunas
tempAba.autoResizeColumns(1, 7);
// Garantir que os dados foram salvos
SpreadsheetApp.flush();
tempPlanilha.setActiveSheet(tempAba);
Utilities.sleep(1000);
const exportUrl = `https://docs.google.com/spreadsheets/d/${tempPlanilha.getId()}/export?` +
`format=pdf&exportFormat=pdf&size=A4&portrait=false&fitw=true&sheetnames=false` +
`&printtitle=false&pagenum=UNDEFINED&gridlines=false&fzr=false&gid=${tempAba.getSheetId()}`;
const token = ScriptApp.getOAuthToken();
const response = UrlFetchApp.fetch(exportUrl, {
headers: { Authorization: `Bearer ${token}` }
});
const pdf = response.getBlob().setName(`Pagamentos_${periodo}.pdf`);
// Ação: download ou email
if (acao === "download") {
DriveApp.getFileById(tempPlanilha.getId()).setTrashed(true);
return { base64: Utilities.base64Encode(pdf.getBytes()), nome: pdf.getName() };
} else if (acao === "email") {
MailApp.sendEmail({
to: emailDestino,
subject: "PDF de Pagamentos",
body: "Segue em anexo o PDF com os pagamentos do período selecionado.",
attachments: [pdf]
});
DriveApp.getFileById(tempPlanilha.getId()).setTrashed(true);
return "Email enviado com sucesso para " + emailDestino;
}
}
function mesmaData(data1, data2) {
return data1.toDateString() === data2.toDateString();
}
function mesmaSemana(data1, data2) {
const inicio = new Date(data2);
inicio.setDate(data2.getDate() - data2.getDay());
const fim = new Date(inicio);
fim.setDate(inicio.getDate() + 6);
return data1 >= inicio && data1 <= fim;
}
function mesmaMes(data1, data2) {
return data1.getMonth() === data2.getMonth() && data1.getFullYear() === data2.getFullYear();
Html:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&display=swap');
body {
font-family: 'Inter', sans-serif;
padding: 20px;
background-color: #f9f9f9;
color: #333;
}
h3 {
margin-top: 20px;
font-size: 16px;
}
select, input[type="email"] {
width: 100%;
padding: 8px;
margin-top: 8px;
margin-bottom: 16px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 14px;
}
label {
font-weight: 500;
}
button {
background-color: #0f9d58;
color: white;
border: none;
padding: 10px 18px;
border-radius: 4px;
font-size: 14px;
cursor: pointer;
transition: background-color 0.3s ease;
}
button:hover {
background-color: #0b7d44;
}
#resultado {
margin-top: 20px;
font-weight: 500;
}
.email-group {
display: none;
}
.radio-group {
margin-top: 10px;
}
</style>
</head>
<body>
<h3>Qual período deseja gerar?</h3>
<select id="periodo">
<option value="dia">Pagamentos no Dia</option>
<option value="semana">Pagamentos na Semana</option>
<option value="mes">Pagamentos no Mês</option>
</select>
<h3>Como deseja receber?</h3>
<div class="radio-group">
<label><input type="radio" name="acao" value="download" checked onchange="atualizarInterface()"> Download</label><br>
<label><input type="radio" name="acao" value="email" onchange="atualizarInterface()"> Enviar por email</label>
</div>
<div class="email-group" id="grupoEmail">
<label for="email">Email:</label>
<input type="email" id="email" value="email@email.com">
</div>
<p></p>
<button id="botao" onclick="enviar()">Download PDF</button>
<div id="resultado" style="color:green;"></div>
<script>
function atualizarInterface() {
const acao = document.querySelector('input[name="acao"]:checked').value;
const grupoEmail = document.getElementById("grupoEmail");
const botao = document.getElementById("botao");
if (acao === "email") {
grupoEmail.style.display = "block";
botao.innerText = "Enviar PDF";
} else {
grupoEmail.style.display = "none";
botao.innerText = "Download PDF";
}
}
function enviar() {
const periodo = document.getElementById("periodo").value;
const acao = document.querySelector('input[name="acao"]:checked').value;
const email = document.getElementById("email").value;
document.getElementById("resultado").innerText = "Processando...";
google.script.run
.withSuccessHandler(function(res) {
if (acao === "download") {
const link = document.createElement('a');
link.href = "data:application/pdf;base64," + res.base64;
link.download = res.nome;
link.click();
document.getElementById("resultado").innerText = "Download iniciado!";
} else {
document.getElementById("resultado").innerText = res;
}
})
.withFailureHandler(function(err) {
document.getElementById("resultado").style.color = "red";
document.getElementById("resultado").innerText = err.message;
})
.gerarPDF(periodo, acao, email);
}
window.onload = atualizarInterface;
</script>
</body>
</html>
Com isso, você já terá o menu funcionando dentro da planilha, pronto para gerar relatórios e enviar e-mails.
Personalização do envio e dos relatórios
Um dos pontos mais úteis dessa automação é a possibilidade de personalização. Você pode:
- Alterar o e-mail padrão no código (linha específica do Apps Script).
- Modificar o assunto e o corpo da mensagem no arquivo HTML.
- Ajustar o layout do PDF conforme sua necessidade.
Dessa forma, além de ganhar agilidade, você também mantém sua identidade visual e o padrão de comunicação da sua empresa.
Conclusão
Automatizar o envio de relatórios em PDF dentro da planilha de Controle de Mensalidade é um divisor de águas para quem lida com cobranças recorrentes. Essa melhoria elimina tarefas repetitivas, economiza tempo e traz mais consistência para a gestão.
Com poucos passos, você transforma sua planilha em uma ferramenta ainda mais poderosa, capaz de cuidar do trabalho pesado para que você se concentre no que realmente faz diferença.
Perguntas Frequentes (FAQs)
1. Preciso ter conhecimentos avançados em programação para aplicar essa automação?
Não. O processo envolve apenas copiar e colar códigos já prontos no Apps Script e no HTML. É simples e replicável.
2. Posso personalizar o relatório em PDF com meu logo ou cores da empresa?
Sim. Basta editar o código HTML para incluir elementos visuais, como logo, cabeçalho ou cores personalizadas.
3. É possível enviar relatórios automáticos para mais de um e-mail?
Sim. No código do Apps Script, você pode configurar múltiplos destinatários separando os endereços por vírgula.