Manage Nonprofit Volunteers with Google Calendar and Forms
Stop chasing volunteers with emails. Build a seamless system that syncs sign-up forms directly to Google Calendar and manages shifts automatically.
Your volunteer coordinator is spending 15 hours a week just emailing people reminders for their Saturday shifts. Worse, three people showed up last week for a slot that needed ten, because the sign-up sheet was buried in a three-week-old email thread.
Volunteers want to help, not wrestle with admin. If they can't click "Add to Calendar" instantly, they forget.
The Automator's Approach
We replace the manual spreadsheet with a direct pipeline: Google Form -> Apps Script -> Google Calendar Invite.
- Volunteer picks a shift in Google Forms.
- Script runs instantly.
- Volunteer gets a calendar invite (with reminders set).
- Coordinator's master calendar updates automatically.
The Code: Auto-Scheduler
1. Setup
- Google Form: Create a dropdown question: "Select Shift" (e.g., "Saturday 9AM - 12PM").
- Google Calendar: Create a specific calendar called "Volunteer Shifts" (optional, keeps your personal calendar clean).
2. The Script
Open the Script Editor from your connected Google Sheet.
// CONFIGURATION
const CALENDAR_ID = 'primary'; // Or the ID of your 'Volunteer Shifts' calendar
const FORM_COLUMNS = {
NAME: 1, // Column B
EMAIL: 2, // Column C
SHIFT: 3 // Column D (The dropdown selection)
};
function onFormSubmit(e) {
const responses = e.namedValues;
const name = responses['Name'][0];
const email = responses['Email'][0];
const shiftSelection = responses['Select Shift'][0]; // "Sat Dec 12, 9AM-12PM"
// Parse the shift string to real dates
// (Assuming format: "YYYY-MM-DD HH:mm to HH:mm")
// Ideally, use a structured value in the form or parsing logic here.
// For this example, we'll assume the value is parseable or mapped.
const {startTime, endTime} = parseShift(shiftSelection);
if (startTime && endTime) {
createInvite(name, email, startTime, endTime, shiftSelection);
}
}
function createInvite(name, email, start, end, shiftName) {
const calendar = CalendarApp.getCalendarById(CALENDAR_ID);
const event = calendar.createEvent(`Volunteer: ${name}`, start, end, {
description: `Shift: ${shiftName}\nVolunteer Contact: ${email}`,
guests: email,
sendInvites: true
});
// Add strict reminders
event.addEmailReminder(24 * 60); // 24 hours before
event.addPopupReminder(60); // 1 hour before
}
// Helper to handle date parsing (customize based on your dropdown text)
function parseShift(shiftString) {
// Example input: "2025-12-28 09:00 to 12:00"
try {
const [datePart, timeRange] = shiftString.split(' ');
const [startStr, endStr] = timeRange.split('to'); // simplistic split
// Construct Date objects
// In production, use libraries like moment.js or specific string parsing
// This is a placeholder for the logic you need based on YOUR specific form values
// For specific implementation, I recommend using "YYYY-MM-DDT09:00:00" as the value
// in your dropdown if possible, or mapping IDs to dates in a separate function.
return {
startTime: new Date(datePart + 'T' + startStr),
endTime: new Date(datePart + 'T' + endStr)
};
} catch (e) {
Logger.log("Error parsing date: " + e.message);
return {startTime: null, endTime: null};
}
}Pro Tip: The "Cancel" Button
What happens if they cancel? The beauty of sending a real Calendar Invite is that the volunteer can click "No" on their calendar event.
- Advanced: Write a script trigger
onEventUpdated(needs Advanced Services) that listens for declines and alerts the coordinator immediately.
Why This Works
Email reminders get ignored. Calendar push notifications do not. By placing the commitment directly on their "Time Infrastructure" (their phone's calendar), you increase show-up rates by 30-50%.
Book a call if you need to handle waitlists, shift swaps, or recurring schedules. I'll build the advanced logic for you.
Related Industry Guides
Need a Custom Automation Solution?
We specialize in building tailored Google Workspace automations for businesses of all sizes. Let us help you eliminate repetitive tasks and streamline your workflows.