How to Make Google Calendar Appointments From Google Forms (2026)

Turn each Google Forms response into a Google Calendar event, free with Apps Script or with Zapier, plus how to stop double bookings and time zone slips.

The Merlin team11 min read

Google Forms can't create Google Calendar events by itself, so you connect the two. The free way is a short Apps Script attached to the form: an On form submit trigger reads the date and time someone picked and books the appointment. The no-code way is a Zapier Zap from New Form Response to Create Detailed Event.

A form is handy when you need more than a time slot: what the call is about, which service someone wants, a budget, a file. The catch is that every answer sits in the form's Responses tab, or a linked sheet, and you still have to copy it into your calendar by hand. This guide sets up both routes, adds a clash check so two people can't land in the same slot, and covers what to fix when an appointment doesn't appear.

Which route to use

Apps Script (free)

Zapier

Google Calendar booking page

Cost

Free with any Google account

Free for 100 tasks monthly and Zaps of two steps

Free; payments and a few extras need a paid Google plan

Speed

Seconds after someone submits

Checks every 15 minutes (free)

Instant

Setup

Paste a script, add one trigger

Point and click

No form at all

Stops double bookings

Yes, with the clash check below

Only with extra steps on a paid plan

Yes, it shows only open times

Custom questions

Any Google Forms question

Any Google Forms question

A booking form with extra fields

Zapier's limits are from its pricing page. If you only need people to pick a free slot, skip the form and give them a Google Calendar booking page instead; more on that near the end.

Build the form so a calendar can read it

A Google Calendar event needs a start time it can trust, so the form should ask for the date and the time with Google Forms' own Date and Time question types, never a short-answer box. Google's question types page lists both: Date takes a calendar date (with an optional year and time under the More menu), and Time takes a clock time or a duration.

My own first request form asked "When works for you?" as a short-answer question. I got back "Tuesday afternoonish" and "after 3 my time", and no script on earth can book those. Two structured questions fixed it.

The questions I use for an appointment request form:

  • Your name (Short answer, required). It becomes the event title.
  • Preferred date (Date, required).
  • Preferred time (Time, required). Add a description such as "Times are Eastern" so nobody answers in their own zone.
  • What would you like to cover? (Paragraph). It goes into the event description, so you walk in prepared.

Then turn on email collection: open the form, click Settings, expand Responses and choose Verified or Responder input under Collect email addresses, as Google's form settings help describes. The address is what lets the calendar send the person an invite. Separately, the Published button at the top right has Set close date or response limit, which stops the form once you have enough bookings.

Keep slot times tidy

If you only take calls on the hour and half hour, say so in the Time question's description. A form can't stop someone typing 2:47, but most people follow a clear instruction.

How to turn Google Forms responses into Google Calendar events with Apps Script

Apps Script turns each form response into a Google Calendar event for free, within seconds. You attach a script to the form, and an installable On form submit trigger runs it every time someone sends a response. You set it up once and leave it alone until the questions change.

Step 1: Open the script editor from your form

  1. Open the form in Google Forms (the editing view, not the live link).
  2. Open the three-dot More icon beside the Publish button and pick Apps Script.
  3. A new project opens, already attached to this form. Name it something you'll recognize later, such as "Form to Calendar".

Step 2: Paste the script

Delete the sample code, paste the script below, and change the four question titles at the top to match your form exactly, capital letters included. Set LENGTH_MINUTES to your appointment length, and leave CALENDAR_ID as it is for now. Click Save.

Code.gs
// Change these to match your form and calendar.
const CALENDAR_ID = 'primary';      // or a calendar ID from its settings page
const LENGTH_MINUTES = 30;          // how long each appointment lasts
const Q = {                         // question titles, copied exactly
  name: 'Your name',
  date: 'Preferred date',
  time: 'Preferred time',
  topic: 'What would you like to cover?'
};

function createAppointment(e) {
  const answers = {};
  e.response.getItemResponses().forEach(function (r) {
    answers[r.getItem().getTitle()] = r.getResponse();
  });
  console.log(JSON.stringify(answers)); // check this on your first test

  const d = String(answers[Q.date]).match(/(\d{4})-(\d{1,2})-(\d{1,2})/);
  const t = String(answers[Q.time]).match(/(\d{1,2}):(\d{2})/);
  if (!d || !t) throw new Error('Could not read date or time: ' + JSON.stringify(answers));

  let hour = Number(t[1]);
  if (/pm/i.test(answers[Q.time]) && hour < 12) hour += 12;
  const start = new Date(Number(d[1]), Number(d[2]) - 1, Number(d[3]), hour, Number(t[2]));
  const end = new Date(start.getTime() + LENGTH_MINUTES * 60 * 1000);

  const calendar = CALENDAR_ID === 'primary'
    ? CalendarApp.getDefaultCalendar()
    : CalendarApp.getCalendarById(CALENDAR_ID);
  const email = e.response.getRespondentEmail() || '';

  if (calendar.getEvents(start, end).length > 0) {
    MailApp.sendEmail(Session.getEffectiveUser().getEmail(),
      'Form request clashes with your calendar',
      (answers[Q.name] || 'Someone') + ' (' + email + ') asked for ' + start + '. Nothing was booked.');
    return;
  }

  calendar.createEvent('Call with ' + (answers[Q.name] || 'form respondent'), start, end, {
    description: (answers[Q.topic] || '') + '\n\nBooked from Google Forms. Contact: ' + email,
    guests: email,
    sendInvites: email !== ''
  });
}

What each part does, so you can trust it:

  • It reads every answer through the form response object, which Google's event object reference describes as the person's whole response.
  • It builds the start time from the date and time answers and adds your appointment length to get the end time.
  • It asks the calendar for anything already booked in that window (the getEvents line), and if something is there, it emails you instead of booking.
  • It creates the event (the createEvent line), puts the topic in the description, adds the person as a guest and sends the invite. Google's CalendarApp reference lists those options: description, location, guests and sendInvites, which is off unless you turn it on.
  • The email comes from getRespondentEmail, which only returns an address when the form collects one, per Google's FormResponse reference.

Google doesn't document the exact text format a Date or Time answer arrives in, which is why the script logs every answer on each run. Read that log after your first test (Step 5), while the only booking at stake is your own.

Step 3: Set the script's time zone

Click Project Settings (the gear icon) and set the time zone to the one your appointments are in. Google's CalendarApp reference warns that times without a time zone are read in the script's time zone, which may not match your calendar's. I once had a form booking land an hour early for exactly this reason: the project was still on a different zone from my calendar.

Step 4: Add the form submit trigger

  1. Open Triggers from the icons down the editor's left edge (it looks like a clock).
  2. Click Add Trigger, in the lower-right corner of the Triggers page.
  3. Choose createAppointment as the function, From form as the event source and On form submit as the event type.
  4. Click Save, then pick your Google account and allow the permissions it asks for: your calendar, the form and sending email as you.

Google's installable triggers guide notes that the trigger always runs as the account that created it. So the events land on that account's calendar and the clash emails come from it, even if a colleague edits the form later.

Step 5: Test it with a real response

Open the live form, submit a request for a time you know is free, then check Google Calendar. If nothing appears within a minute, go back to the script and click Executions in the sidebar: each run shows the logged answers and any error. Then submit a second request for the same slot and confirm you get the clash email instead of a second event.

For the first day, I point the script at a spare test calendar rather than my main one (the next section shows how). If the date comes out wrong, the mistake sits somewhere harmless and nobody outside gets a strange invite.

Book on a different calendar

To keep appointments apart from your own meetings, create a calendar called something like "Bookings", open its settings, copy the Calendar ID under Integrate calendar, and paste it in place of 'primary' on the CALENDAR_ID line. The CalendarApp reference says getCalendarById returns nothing if the account can't access that calendar, so use one owned by, or shared with, the account that made the trigger. One thing to know: the clash check then only looks at that calendar, not your main one.

The simple createEvent call doesn't add video. Google Meet links come from the Google Calendar API, which, per Google's conference guide, needs a conference request with a new request ID and the conferenceDataVersion parameter set to 1. That means switching on the Calendar advanced service in Apps Script and rewriting the booking line, so if every appointment needs Meet and you don't want to write code, the Zapier route below is easier.

How to book Google Calendar appointments from Google Forms with Zapier

Zapier connects Google Forms to Google Calendar without code: a Zap with the New Form Response trigger and the Create Detailed Event action books one event per response. Both are listed on Zapier's Google Forms and Google Calendar page.

  1. In Zapier, start a new Zap.
  2. For the trigger, choose Google Forms and New Form Response, sign in with the Google account that owns the form, and select it.
  3. Test the trigger. The test needs at least one existing response, so submit one first if the form is new.
  4. For the action, choose Google Calendar and Create Detailed Event, connect the account and pick the calendar.
  5. Map the answers: the name into the event title, the topic into the description, the date and time into the start, and the email address as an attendee.
  6. Set the end time. Zapier's own walkthrough suggests adding a fixed length to the start time in the end field, or you can ask for an end time in the form.
  7. Turn on Google Meet conferencing in the action if you want a video link, test the step, check the event in your calendar, then switch the Zap on.

Three limits from Zapier's pricing page shape the choice. Without a paid plan, Zapier looks for new responses every 15 minutes, which means a request sent at 9:01 might not reach your calendar until about 9:15. You get 100 tasks per month, and each booked appointment uses one. And Zaps stop at two steps, so a clash check (a calendar search plus a filter before the booking) needs Professional, listed at $29.99 monthly, or $19.99 per month when paid annually.

Zapier earns its place when your team has a paid account anyway, or when every appointment needs a Meet link and nobody wants to touch code. For a single form on a single calendar, I'd rather keep the free script. Our Zapier alternatives page compares how other tools count the same workflow.

Why isn't my Google Forms appointment showing up in Google Calendar?

When a form response doesn't become an event, the culprit is usually the trigger, the date format or the time zone. Start with the first check and stop at the one that fits:

  • No trigger, or the wrong function. Open Triggers and confirm there's one on createAppointment, From form, On form submit. Clicking Run in the editor always ends in an error, because there's no form response for the script to read; test through the live form instead.
  • Permissions never finished. If you closed the Google permission window early, the trigger can't touch your calendar. Delete it and add it again.
  • The question titles don't match. A renamed question breaks the script. The log in Executions shows the titles exactly as the script sees them.
  • The date or time couldn't be read. The error message prints every answer. Compare the date and time with the patterns in the script and adjust if your form returns something different.
  • It's on the wrong calendar or at the wrong hour. Check the calendar ID, then the time zone in Project Settings.
  • A clash blocked it. The script emails you instead of booking. An all-day event in the same calendar counts as a clash too, so keep holidays and reminders on another calendar.
  • You hit a quota. Google's Apps Script quotas let personal accounts create 5,000 calendar events daily and Google Workspace accounts 10,000, so this only bites on very busy forms.

When a trigger fails, the installable triggers guide says Apps Script emails the owner a "Summary of failures for Apps Script" that opens the project in one click. Keep an eye out for it; it's the quickest route to the error.

When a booking page beats a form

Google Calendar's own booking page is better than a form whenever people should only pick from times you're actually free. Google's appointment schedule help explains that the booking page shows your availability, can check your calendars for conflicts, and lets you add extra fields to the booking form beyond the required name and email. Google adds that some schedule features require a qualifying Google Workspace or Google One subscription; payments run through a connected Stripe account.

A form still wins when the appointment needs approval or triage: a request you might decline, a service someone has to choose, a file you need before the call. When I take intro-call requests, I want to read why someone's asking before the time is locked in, so the form route fits. Our guide to Google Calendar appointment scheduling covers the booking page setup.

If what you need is the reverse, adding sign-ups as guests to one event you already created, that's a different setup, covered in how to add attendees to Google Calendar from Google Forms.

Before you share the form

  • Submit two test requests for the same time and confirm the second one emails you instead of booking.
  • Check that the invite arrives at the test email address and shows the right hour.
  • Put your time zone in the Time question's description.
  • Turn on Get email notifications for new responses under the form's Responses tab, so you see requests even when no event is made.
  • Set a close date or response limit if you have a fixed number of slots.
  • Switch the calendar ID from your test calendar to the real one.

For more ways to wire Google Forms, Sheets and Gmail together, see our overview of Google Workspace automation.

Book the requests that skip the form

Not every appointment request comes through the form; some arrive as an email or a quick message. With Merlin connected to your Google Calendar, you can ask in chat to put that call on the calendar. You see the event first, can change the time or guests, and it's only booked once you say yes.

Get Merlin

Frequently asked questions

Can Google Forms create Google Calendar events automatically?

Not on its own. Google Forms has no calendar setting, so you add an Apps Script with an On form submit trigger, which is free, or connect the two with a Zapier Zap.

Can I send Google Forms responses to Google Calendar for free?

Yes. An Apps Script attached to the form books an event for each response at no cost, within Google's daily quota of 5,000 calendar events for personal accounts and 10,000 for Google Workspace.

How do I stop two people booking the same time from a Google Form?

Have the script look for existing events in the requested window before it books, as the script in this guide does. Google Forms itself can't hide times that are taken; a Google Calendar booking page can.

Will the person who filled in the form get a calendar invite?

Only if the form collects email addresses and the script or Zap adds that address as a guest. In Apps Script, the sendInvites option must also be turned on, because it's off by default.

Why is my Google Forms appointment at the wrong time?

Usually the Apps Script project is set to a different time zone from your calendar. Change it under Project Settings, and tell respondents which time zone to answer in.

Can I add a Google Meet link to events created from Google Forms?

Yes. Zapier's Create Detailed Event action has a Google Meet option, and in Apps Script you need the Google Calendar API's conference request instead of the basic createEvent call.

you scrolled all the way down here

your next free moment starts in three minutes

getting started takes three minutes. sign in, and i'm on your to-dos, starting with who's waiting on you

you decide what comes after

Download for Mac Free forever. No credit card.