如何查询Google Calendar中未被使用的预约时段?
解决方案:获取Google Calendar的空闲预约时段
Google Calendar确实不会将未被占用的时段存储为事件,因此无法直接查询空闲时段,但可以通过反向计算已占用事件与预设可预约时间的间隙来实现需求。以下是可直接使用的脚本和思路:
实现脚本
替换你原有的getCalendarEvents函数,这个脚本会根据你设定的可预约规则(比如工作日9:00-18:00,每30分钟一个时段),计算出未来3周内的所有空闲时段并写入Sheet:
function getFreeAppointmentSlots() { // 获取活动工作表 var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 清除现有内容并设置表头 sheet.clear(); sheet.appendRow(['空闲时段开始', '空闲时段结束']); // 时间范围:当前时间到3周后 var now = new Date(); var threeWeeksFromNow = new Date(now.getTime() + 3 * 7 * 24 * 60 * 60 * 1000); // 可预约规则:工作日9:00-18:00,每个时段30分钟 const workStartHour = 9; const workEndHour = 18; const slotDuration = 30; // 分钟 // 获取指定范围内的所有已占用事件并按开始时间排序 var events = CalendarApp.getDefaultCalendar().getEvents(now, threeWeeksFromNow); events.sort((a, b) => a.getStartTime() - b.getStartTime()); // 遍历每一天,生成可预约时段并检查是否空闲 let currentDate = new Date(now); currentDate.setHours(0, 0, 0, 0); // 重置到当天凌晨 while (currentDate <= threeWeeksFromNow) { // 跳过周末(周六=6,周日=0) const dayOfWeek = currentDate.getDay(); if (dayOfWeek === 0 || dayOfWeek === 6) { currentDate.setDate(currentDate.getDate() + 1); continue; } // 生成当天的所有可预约时段 let slotStart = new Date(currentDate); slotStart.setHours(workStartHour, 0, 0, 0); const dayEnd = new Date(currentDate); dayEnd.setHours(workEndHour, 0, 0, 0); while (slotStart < dayEnd) { const slotEnd = new Date(slotStart.getTime() + slotDuration * 60 * 1000); // 检查该时段是否被占用 let isOccupied = false; for (let event of events) { const eventStart = event.getStartTime(); const eventEnd = event.getEndTime(); // 判断时段是否与事件重叠 if (!(slotEnd <= eventStart || slotStart >= eventEnd)) { isOccupied = true; break; } } // 如果未被占用,写入工作表(只保留当前时间之后的时段) if (!isOccupied && slotStart >= now) { sheet.appendRow([slotStart, slotEnd]); } // 跳到下一个时段 slotStart = slotEnd; } // 跳到下一天 currentDate.setDate(currentDate.getDate() + 1); } }
关键说明
- 可预约规则自定义:你可以修改
workStartHour、workEndHour、slotDuration这几个变量,适配你的预约时间要求,比如改成工作日10:00-17:00,每60分钟一个时段。 - 周末排除:脚本默认跳过周六周日,如果你需要包含周末,直接删除判断
dayOfWeek的代码块即可。 - 重叠判断逻辑:通过比较时段与已存在事件的时间范围,判断是否被占用,确保只保留完全空闲的时段。
- 时间范围控制:脚本只保留当前时间之后的空闲时段,避免显示已经过去的时间。
其他可选方案
如果你使用了Google Calendar的**预约日程(Appointments)**功能,可以直接通过Calendar.Appointments服务(需要启用高级Google服务)来获取官方定义的空闲预约时段,这种方式更精准,但需要先在Calendar中配置好预约规则。
内容的提问来源于stack exchange,提问作者Tabberwocky
相关产品推荐
相关产品推荐

