使用Google脚本迁移日历事件时遇‘Not Found’错误的问询
解决Google脚本中Calendar.Events.move的"Not Found"错误
嘿,这个Not Found错误本质上是Google Calendar API在告诉你:它找不到你要操作的资源——要么是你传入的事件ID无效,要么是日历ID有问题,更可能的是你调用Calendar.Events.move的方式不对。
咱们来拆解你代码里的问题:
1. 核心问题:Calendar.Events.move的调用参数错误
你现在的调用是:
Calendar.Events.move(pubCalId, eventToMove.getId(), privCalId);
但Google Apps Script的Calendar Advanced Service里,move方法的正确语法是需要把目标日历ID放在配置对象的destination属性里,而不是直接作为第三个参数。正确的参数结构应该是:
Calendar.Events.move(pubCalId, eventId, { destination: privCalId });
2. 次要问题:事件ID的兼容性
CalendarApp.getEvents()返回的事件对象,其getId()方法有时候返回的是服务本地的ID格式,而Calendar Advanced Service需要的是全局唯一的事件ID。更稳妥的做法是使用eventToMove.getOriginalId()来获取符合API要求的ID(如果是原生Google日历事件,getId()和getOriginalId()可能一致,但用后者兼容性更好)。
修正后的完整代码
function export_gcal_to_gsheet(){ // pubCal: public calendar // privCal: private calendar var pubCalId = "addressForPubicCal@group.calendar.google.com"; var privCalId = "addressForPrivateCal@group.calendar.google.com"; var pubCal = CalendarApp.getCalendarById(pubCalId); // Change date range to move events from pubCal to privCal var startDate = new Date("January 1, 2018 00:00:00 CST"); var endDate = new Date("January 04, 2018 23:59:59 CST"); // Extract events between certain dates in public calendar. var events = pubCal.getEvents(startDate, endDate); // Loop through all Calendar events // 用for循环比while+shift更直观,避免数组操作的潜在问题 for (var i = 0; i < events.length; i++){ var eventToMove = events[i]; // 修正调用方式,用getOriginalId()获取正确的事件ID Calendar.Events.move(pubCalId, eventToMove.getOriginalId(), { destination: privCalId }); } }
额外注意事项
- 确保你已经在脚本编辑器中启用了Calendar Advanced Service:点击「资源」→「高级Google服务」,找到Calendar API并开启它。
- 检查两个日历ID是否完全正确,没有拼写错误(比如你代码里的
pubCall是笔误,不过变量名是pubCalId,应该没问题)。 - 确认你的脚本有访问这两个日历的权限:第一次运行脚本时,会弹出权限请求,需要授权允许脚本访问你的日历数据。
内容的提问来源于stack exchange,提问作者user1301593
相关产品推荐
相关产品推荐

