如何在Google Apps Script中识别Calendar工作地点事件以修复脚本报错?
解决Google日历工作地点事件无法修改颜色的问题
问题原因
Google CalendarApp.getEvents接口现在会返回工作地点事件这类特殊系统事件,这类事件不支持修改颜色,导致原有脚本调用setColor时出错。
两种判断并跳过工作地点事件的方法
方法1:通过事件标题判断(简单快速)
工作地点事件默认标题为“工作地点”(英文环境为"Work location"),可直接通过标题过滤:
function myFunction() { var today = new Date(); today.setHours(0,0,0,0); var nextWeek = new Date(today); nextWeek.setDate(nextWeek.getDate() + 7); CalendarApp.getEvents(today, nextWeek).forEach(event => { // 跳过工作地点事件(根据你的日历语言调整标题文本) if (event.getTitle().trim() === '工作地点') return; if(event.isRecurringEvent()) { Logger.log(event.getTitle()); Logger.log(event.getDescription()); Logger.log(event.getStartTime()); Logger.log(event.getEndTime()); event.setColor(CalendarApp.EventColor.ORANGE); } }); }
注意:如果用户手动修改了工作地点事件的标题,这种方法会失效。
方法2:通过高级Calendar API判断(更可靠)
工作地点事件的eventType字段固定为work_location,需启用高级Calendar服务来获取该字段:
- 在脚本编辑器中,点击「扩展」→「Apps Script 编辑器」(已在编辑器中可直接下一步)
- 点击「服务」→「添加服务」,找到「Calendar API」并启用
- 使用以下代码:
function myFunction() { var today = new Date(); today.setHours(0,0,0,0); var nextWeek = new Date(today); nextWeek.setDate(nextWeek.getDate() + 7); var defaultCalendarId = CalendarApp.getDefaultCalendar().getId(); // 调用高级Calendar API获取事件,包含eventType字段 var eventsResponse = Calendar.Events.list(defaultCalendarId, { timeMin: today.toISOString(), timeMax: nextWeek.toISOString(), singleEvents: false // 保留重复事件的主事件 }); if (eventsResponse.items) { eventsResponse.items.forEach(apiEvent => { // 跳过工作地点事件 if (apiEvent.eventType === 'work_location') return; // 判断是否为重复事件 if (apiEvent.recurrence) { // 通过事件ID获取CalendarApp对象,执行颜色修改 var calendarEvent = CalendarApp.getEventById(apiEvent.id); if (calendarEvent) { calendarEvent.setColor(CalendarApp.EventColor.ORANGE); Logger.log(`已修改重复事件颜色: ${apiEvent.summary}`); } } }); } }
优点:不受标题修改影响,能准确识别工作地点事件。
内容的提问来源于stack exchange,提问作者IMTheNachoMan
相关产品推荐
相关产品推荐

