Sim, dá para criar um agendamento automático usando Google Forms, Google Sheets e Google Calendar. O formulário coleta os dados do cliente, a planilha recebe a resposta e um gatilho do Apps Script cria o evento na agenda sem que você precise copiar e colar cada pedido.
O método funciona bem para profissionais autônomos, clínicas pequenas, professores, consultores e empresas de serviço. Ele não é um sistema completo de reservas: o formulário não mostra os horários livres antes do envio. Por isso, o exemplo abaixo também verifica conflitos e marca a resposta quando o horário já está ocupado.

Como funciona o agendamento automático
O fluxo tem quatro peças:
- Google Forms: recebe nome, e-mail, serviço, data e horário desejados.
- Google Sheets: guarda cada resposta em uma linha.
- Apps Script: reage ao envio do formulário e transforma os textos em datas.
- Google Calendar: recebe o evento, desde que não exista outro compromisso no mesmo intervalo.
O Apps Script usa um gatilho instalável. Diferentemente de um gatilho simples, ele pode chamar serviços que exigem autorização, como o Calendar. O evento de envio também fornece os valores enviados pelo formulário, conforme a documentação de eventos do Google.
1. Crie o formulário com campos previsíveis
Abra o Google Forms e crie um formulário com estas perguntas. Use exatamente os títulos abaixo para que o código encontre os valores:
- Nome — resposta curta;
- E-mail — resposta curta com validação de e-mail;
- Data — pergunta do tipo data;
- Horário — lista suspensa com horários como 09:00, 10:00 e 11:00;
- Serviço — lista suspensa ou múltipla escolha.
Na aba Respostas, clique para vincular o formulário a uma planilha. O Google informa que as respostas podem ser salvas em uma planilha nova ou existente; deixe a primeira linha com os títulos criados automaticamente. Depois, acrescente manualmente uma coluna chamada Status no fim da tabela.
2. Cole o script na planilha
Abra a planilha de respostas, entre em Extensões > Apps Script, apague o conteúdo inicial e cole o código abaixo. Ele considera que cada atendimento dura 60 minutos e usa a agenda padrão da conta.
const DURACAO_MINUTOS = 60;
function valor(dados, campo) {
return dados[campo] && dados[campo][0]
? String(dados[campo][0]).trim()
: '';
}
function converterDataHora(dataTexto, horarioTexto) {
const partesData = dataTexto.split(/[\/-]/).map(Number);
const partesHora = horarioTexto.split(':').map(Number);
if (partesData.length !== 3 || partesHora.length < 2) {
throw new Error('Data ou horário inválido.');
}
let dia, mes, ano;
if (partesData[0] > 31) {
[ano, mes, dia] = partesData;
} else if (partesData[2] > 31) {
[dia, mes, ano] = partesData;
} else {
[dia, mes, ano] = partesData; // formulário em português do Brasil
}
const data = new Date(ano, mes - 1, dia, partesHora[0], partesHora[1], 0);
if (isNaN(data.getTime())) throw new Error('Não foi possível interpretar a data.');
return data;
}
function onFormSubmit(e) {
const dados = e.namedValues;
const linha = e.range.getRow();
const planilha = e.range.getSheet();
const nome = valor(dados, 'Nome');
const email = valor(dados, 'E-mail');
const dataTexto = valor(dados, 'Data');
const horarioTexto = valor(dados, 'Horário');
const servico = valor(dados, 'Serviço');
const inicio = converterDataHora(dataTexto, horarioTexto);
const fim = new Date(inicio.getTime() + DURACAO_MINUTOS * 60 * 1000);
const agenda = CalendarApp.getDefaultCalendar();
const conflitos = agenda.getEvents(inicio, fim).some(function(evento) {
return evento.getStartTime() < fim && evento.getEndTime() > inicio;
});
if (conflitos) {
planilha.getRange(linha, e.range.getNumColumns() + 1)
.setValue('Conflito: horário ocupado');
return;
}
agenda.createEvent(
servico + ' — ' + nome,
inicio,
fim,
{
description: 'Solicitante: ' + nome + '\nE-mail: ' + email + '\nServiço: ' + servico
}
);
planilha.getRange(linha, e.range.getNumColumns() + 1).setValue('Agendado');
}
O método CalendarApp.createEvent() cria o evento com título, início e fim. O código não envia e-mail ao cliente nem altera a agenda se houver sobreposição; ele apenas registra o resultado na coluna Status.

3. Ajuste o fuso horário
Antes de testar, abra as configurações do projeto no Apps Script e escolha America/Sao_Paulo (ou o fuso usado pela sua operação). O Google alerta que datas sem fuso explícito podem ser interpretadas no fuso do script, que pode ser diferente do calendário.
Também confira o fuso da agenda em Google Calendar > Configurações. Se o formulário estiver em português do Brasil, mantenha as datas no formato dia/mês/ano e ofereça horários em intervalos definidos, como de 30 ou 60 minutos.
4. Crie o gatilho que executa o código
O nome onFormSubmit não basta para ativar a automação. No editor do Apps Script:
- Abra a área Acionadores, no ícone de relógio.
- Clique em Adicionar acionador.
- Escolha a função
onFormSubmit. - Em origem do evento, selecione Da planilha.
- Em tipo de evento, selecione Ao enviar formulário.
- Salve e aceite as permissões para acessar o Google Calendar e a planilha.
Esse é um gatilho instalável, então ele roda com a autorização da conta que o criou. Se outra pessoa assumir a planilha, revise os acionadores: a autorização e o proprietário da automação importam para evitar que o fluxo pare sem aviso.
5. Faça um teste controlado
Envie uma resposta de teste com um horário futuro e confira três pontos:
- uma nova linha foi criada na planilha;
- a coluna Status recebeu “Agendado”;
- o evento apareceu na agenda padrão com o título do serviço e do cliente.
Depois, envie outra resposta com o mesmo horário. O status deve indicar conflito e um segundo evento não deve ser criado. Se o teste falhar, abra Executions no Apps Script para ver o erro de autorização, nome de campo ou conversão de data.
Limitações que você precisa conhecer
O formulário não reserva o horário antes do envio. Duas pessoas podem escolher o mesmo horário quase ao mesmo tempo; o script evita a criação de dois eventos, mas não oferece ao visitante uma tela de horários disponíveis. Para isso, use um sistema de reservas ou construa uma interface que consulte a agenda antes de aceitar o pedido.
Também existe a possibilidade de a automação atingir limites e cotas do Apps Script. Em operações pequenas, o fluxo costuma ser suficiente, mas não trate essa solução como um sistema de atendimento crítico sem monitoramento, registro de falhas e uma forma de contato alternativa.
Se você quiser ampliar o fluxo para notificações, vale entender primeiro o caminho de automação com planilhas e scripts explicado no guia do JSMS sobre envio automático de e-mails pelo Google Sheets. A lógica é parecida, mas o envio de mensagens exige cuidado com consentimento e limites.
Perguntas frequentes
O Google Forms mostra os horários livres automaticamente?
Não. O formulário coleta a escolha do visitante, mas não consulta a agenda em tempo real. O script deste guia verifica o conflito depois do envio.
Preciso pagar por um sistema de agendamento?
Não necessariamente. Para um fluxo básico, você pode usar uma conta Google com Forms, Sheets, Calendar e Apps Script. As cotas, permissões da conta e necessidades de suporte podem exigir outra solução conforme o volume crescer.
Posso usar outra agenda do Google Calendar?
Sim. Troque CalendarApp.getDefaultCalendar() por CalendarApp.getCalendarById('ID_DA_AGENDA') e autorize o acesso à agenda escolhida. O ID pode ser encontrado nas configurações do calendário.
O cliente recebe confirmação por e-mail?
Não com o código acima. Ele apenas cria o evento e atualiza o status na planilha. Uma etapa posterior pode usar um serviço de e-mail, desde que você defina uma mensagem, tenha consentimento e trate os limites de envio.