如何让Google Apps Script的getEvents仅返回重复事件根实例?
如何让Google Apps Script的getEvents直接返回重复事件的根实例
默认情况下,CalendarApp.getEvents()会返回指定时间范围内所有展开的事件实例,包括重复事件的所有子实例。目前没有直接让getEvents仅返回重复事件根实例的参数或内置方法,但可以通过高效的筛选逻辑达到目的,无需逐个低效检查。
高效筛选根实例的实现方案
方法1:通过isRecurring()和getOriginalEvent()去重
利用事件的重复属性判断,获取其原始根实例后,通过ID去重避免重复添加:
const calendar = CalendarApp.getDefaultCalendar(); const startDate = new Date(2025, 2, 24); const endDate = new Date(2025, 2, 25); const events = calendar.getEvents(startDate, endDate); // 用Set存储根事件ID,确保唯一性 const rootEventIds = new Set(); const rootEvents = []; events.forEach(event => { if (event.isRecurring()) { const originalEvent = event.getOriginalEvent(); const rootId = originalEvent.getId(); if (!rootEventIds.has(rootId)) { rootEventIds.add(rootId); rootEvents.push(originalEvent); } } else { // 非重复事件直接加入结果 rootEvents.push(event); } }); // 处理最终的根事件列表 rootEvents.forEach(rootEvent => { console.log(`事件标题:${rootEvent.getTitle()},根实例ID:${rootEvent.getId()}`); });
方法2:通过事件ID格式提前优化(减少API调用)
重复事件的子实例ID通常带有下划线后缀(格式为主事件ID_时间戳),可以先通过ID特征快速筛选,再调用API确认,减少不必要的getOriginalEvent()请求:
const calendar = CalendarApp.getDefaultCalendar(); const startDate = new Date(2025, 2, 24); const endDate = new Date(2025, 2, 25); const events = calendar.getEvents(startDate, endDate); const rootEventIds = new Set(); const rootEvents = []; events.forEach(event => { const eventId = event.getId(); if (eventId.includes('_')) { // 带下划线的是子实例,获取其根实例 const originalEvent = event.getOriginalEvent(); const rootId = originalEvent.getId(); if (!rootEventIds.has(rootId)) { rootEventIds.add(rootId); rootEvents.push(originalEvent); } } else { // 不带下划线的,判断是否是重复事件的主实例 if (event.isRecurring()) { if (!rootEventIds.has(eventId)) { rootEventIds.add(eventId); rootEvents.push(event); } } else { rootEvents.push(event); } } }); // 遍历处理根事件 rootEvents.forEach(rootEvent => { console.log(rootEvent.getTitle()); });
补充说明
Google Apps Script的CalendarApp服务目前没有提供直接过滤重复事件子实例的参数,上述方案是当前最可行的优化方式。通过Set存储根事件ID,可以确保每个重复事件的根实例只被添加一次,同时兼顾非重复事件的处理。
内容的提问来源于stack exchange,提问作者IMTheNachoMan
相关产品推荐
相关产品推荐

