Pular para o conteúdo
Automação

Como criar agendamento automático com Google Forms e Google Calendar

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.

Agenda digital com laptop e calendário sobre uma mesa

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.

Calendário e computador usados para organizar agendamentos

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:

  1. Abra a área Acionadores, no ícone de relógio.
  2. Clique em Adicionar acionador.
  3. Escolha a função onFormSubmit.
  4. Em origem do evento, selecione Da planilha.
  5. Em tipo de evento, selecione Ao enviar formulário.
  6. 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.