Qué necesitas
- Una cuenta de Make.com con conexiones a Google Forms (o Google Sheets) y Google Calendar
- Un formulario de Google con nombre, email, una pregunta de fecha, una pregunta de hora y, a ser posible, una pregunta de duración
- Un calendario de Google que puedas editar, a ser posible uno aparte solo para reservas
- Una respuesta de prueba ya enviada
Montaje paso a paso
1. Añade el trigger
Añade Google Forms – Watch Responses y selecciona tu formulario. (El antiguo módulo Watch Responses de Google Sheets aparece ahora como legacy.) Si prefieres trabajar con la hoja de respuestas vinculada, usa en su lugar Google Sheets – Watch New Rows sobre esa hoja. Elige tu respuesta de prueba como punto de partida y haz clic en Run once.
2. Mira cómo llegan de verdad la fecha y la hora
Abre la burbuja de salida. Las preguntas de fecha de Google Forms suelen llegar como texto del tipo 2026-10-15 y las de hora como 14:30, pero el formato puede depender del módulo y de tu configuración regional, sobre todo si lees desde la hoja vinculada. Mira los valores reales antes de escribir cualquier fórmula. La mayoría de los errores con fechas vienen de suponer el formato.
3. Combina fecha y hora: Tools – Set variable
Añade Tools – Set variable. Llámala start_text y pon como valor la fecha y la hora separadas por un espacio:
{{1.Date}} {{1.Time}}
Los nombres de los campos dependen de los títulos de las preguntas de tu formulario, así que usa el panel de mapeo. Guardar esto en una variable mantiene cortas las fórmulas posteriores y te permite revisar el valor combinado por separado.
4. Interprétala en la zona horaria correcta: Tools – Set variable
Añade una segunda variable llamada start con este valor:
{{parseDate(2.start_text; "YYYY-MM-DD HH:mm"; "Europe/Berlin")}}
Cambia la zona por la que corresponda a tus reservas. Si no indicas la zona, Make usa la zona horaria de la configuración de tu perfil de Make; si la indicas, el resultado será el mismo edite quien edite el escenario. Si tu hoja devuelve fechas como 15/10/2026, adapta la cadena de formato, por ejemplo DD/MM/YYYY HH:mm.
5. Calcula la hora de fin
Añade una tercera variable llamada end:
{{addMinutes(3.start; ifempty(1.Duration; 60))}}
ifempty() usa 60 minutos como valor por defecto cuando la pregunta de duración se ha dejado en blanco. Si tu pregunta de duración devuelve texto como «30 minutos», añade antes un lookup o un pequeño switch, porque addMinutes necesita un número.
6. Comprueba si el evento ya existe: Google Calendar – Search Events
Antes de crear nada, busca un evento que ya lleve el ID de esta respuesta. Selecciona el calendario y pon el ID de la respuesta en el campo Query, que busca en el texto de los eventos (según el trigger, el campo puede llamarse response ID o timestamp). El evento incluirá ese ID en el paso 8. Si no hay ID, también te sirve como clave única la marca de tiempo junto con la dirección de email.
7. Cuenta y filtra: Tools – Numeric aggregator
Pon la búsqueda como Source module y usa Count. Después añade un filtro en el siguiente enlace: el resultado es igual a 0. Necesitas un agregador porque, sin él, una búsqueda sin resultados terminaría el escenario con cada respuesta nueva. Por defecto, el agregador devuelve igualmente un recuento de 0 cuando no encuentra nada; deja desactivada su opción avanzada Stop processing after an empty aggregation.
8. Crea el evento: Google Calendar – Create an Event
Selecciona el calendario y mapea:
- Event name:
Call with {{1.Name}} - Start date:
{{3.start}} - End date:
{{4.end}} - Description:
Form response ID: {{1.ResponseID}}más el resto de respuestas, como el email y las notas - Attendees: la dirección de email del formulario, solo si quieres que la persona figure en el evento. Que Google le envíe o no una invitación depende de Send notifications about the event creation (all guests, external guests only o none).
Los números de módulo de las variables en estos ejemplos son solo orientativos. Usa el panel de mapeo para ver los tuyos.
9. Opcional: escribe el resultado en la hoja
Si tu trigger es una hoja, añade Google Sheets – Update a Row y escribe el enlace o el ID del evento en una columna «Evento de calendario». Así verás de un vistazo en la hoja qué reservas se han creado, y podrás usar esa columna, vacía o no, como comprobación alternativa de duplicados.
10. Prueba
Envía una respuesta para mañana a las 14:30 en tu propio calendario. Comprueba la hora del evento en la vista de calendario y en el móvil; después vuelve a ejecutar la misma respuesta y confirma que no aparece un segundo evento.
Errores frecuentes y cómo solucionarlos
El evento sale desfasado una hora o más. La fecha se interpretó sin zona horaria, así que Make usó la zona de la configuración de tu perfil. Pasa la zona en parseDate() como en el paso 4 y revisa la zona horaria del propio calendario en la configuración de Google Calendar. Compruébalo dos veces en torno a los cambios de horario, porque dos zonas pueden cambiar en fechas distintas.
«Invalid date» o falta el valor de inicio. La cadena de formato no coincide con el texto. 15/10/2026 y 2026-10-15 necesitan formatos distintos, y una configuración regional que pone primero el mes intercambia el día y el mes. Muestra el valor del módulo Set variable y compáralo con tu formato carácter por carácter.
La hora de fin es igual a la de inicio, o el módulo da error con el fin. La duración estaba vacía, era texto o era cero. Usa ifempty() y asegúrate de que el valor sea un número. Una pregunta con respuestas como «30 min» necesita mapearse primero a 30.
Dos eventos para una sola respuesta. El trigger se disparó dos veces o volviste a ejecutar el escenario a mano. La búsqueda y el filtro de los pasos 6 y 7 detectan ambos casos. Si te los saltas, cada nueva ejecución crea siempre una copia.
«Not found» o «insufficient permissions» en el calendario. La cuenta de Google conectada no puede editar ese calendario. Comparte el calendario con esa cuenta con el nivel de permisos adecuado o selecciona el calendario propio de la cuenta.
Los invitados no reciben la invitación. Send notifications about the event creation está en none, o el email tiene una errata o un espacio al final. Envuelve la dirección en trim() y pon las notificaciones en all guests.