Google Apps Script假期日历:如何正确识别全天OOO事件并导入?
解决Google日历OOO全天事件无法被识别的问题
问题背景
我在使用Google Apps Script开发的假期日历脚本时遇到了一个问题:想要仅导入全天事件,包括普通全天事件和OOO(外出)全天事件,但现有的判断逻辑会把所有OOO事件都判定为非全天事件,导致无法导入。即使是明确设置为全天的OOO事件,CalendarEvent.isAllDayEvent()方法也始终返回false。
原代码如下:
function shouldImportEvent(user, keyword, event) { // Filters out events where the keyword did not appear in the summary // (that is, the keyword appeared in a different field, and are thus // is not likely to be relevant). if (event.summary.toLowerCase().indexOf(keyword) < 0) { return false; } // Only import events that are all day let calEvent = CalendarApp.getCalendarById(user.getEmail()).getEventById(event.id) if (!calEvent.isAllDayEvent()) { // all outOfOffice events are returning here return false; } if (!event.organizer || event.organizer.email == user.getEmail()) { // If the user is the creator of the event, always imports it. return true; } // Only imports events the user has accepted. if (!event.attendees) return false; let matching = event.attendees.filter(function(attendee) { return attendee.self; }); return matching.length > 0 && matching[0].responseStatus == 'accepted'; }
问题原因
Google日历的OOO事件在底层结构上和普通全天事件不同,isAllDayEvent()方法的判断逻辑并不适用于OOO事件。全天OOO事件的结束日期会被自动设置为次日的0点,而不是和普通全天事件一样使用相同的日期。
解决方案
修改全天事件的判断逻辑,分别处理普通事件和OOO事件:
- 对OOO事件,通过检查
start.date和end.date的日期差是否为1天来判断是否是全天事件 - 对普通事件,保留原有的
isAllDayEvent()判断逻辑
修改后的完整代码:
function shouldImportEvent(user, keyword, event) { // 过滤摘要中不含指定关键词的事件 if (event.summary.toLowerCase().indexOf(keyword) < 0) { return false; } let isAllDay = false; // 处理OOO类型事件 if (event.outOfOfficeProperties) { // 全天OOO事件的start和end日期会相差1天 if (event.start.date && event.end.date) { const startDate = new Date(event.start.date); const endDate = new Date(event.end.date); const dayDiff = (endDate - startDate) / (1000 * 60 * 60 * 24); isAllDay = dayDiff === 1; } } else { // 普通事件使用原方法判断 const calEvent = CalendarApp.getCalendarById(user.getEmail()).getEventById(event.id); isAllDay = calEvent.isAllDayEvent(); } if (!isAllDay) { return false; } // 事件创建者直接导入 if (!event.organizer || event.organizer.email === user.getEmail()) { return true; } // 仅导入用户已接受的事件 if (!event.attendees) return false; const matchingAttendee = event.attendees.find(attendee => attendee.self); return matchingAttendee && matchingAttendee.responseStatus === 'accepted'; }
关键修改点
- 新增对
event.outOfOfficeProperties的检测,识别OOO事件 - 通过日期差判断OOO事件是否为全天(Google日历中全天OOO事件结束日期为次日)
- 优化了参会者判断逻辑,使用
find替代filter更高效 - 使用严格相等
===替代==,避免类型转换问题
内容的提问来源于stack exchange,提问作者Lindsey Hanna SheHer
相关产品推荐
相关产品推荐

