Google脚本在日历之间移动事件:Calendar.Events.move找不到事件

时间:2020-04-24 05:32:42

标签: events google-apps-script google-calendar-api move

[注意:已更新以更好地反映对该问题的理解]

我正在尝试使用Google脚本将所有事件从一个Google日历移动到另一个日历。

我写了以下代码:

function move_all_events()
{
  var fromYear = 2016;
  var toYear=2020
  var fromDate = new Date(fromYear,0,1,0,0,0); //Year, Month (where 0 = Jan, 1 = Feb...), Hour, Min, Sec, Millisecond
  var toDate = new Date(toYear,1,0,0,0);
  var fromCalendarName = 'Calendar1';
  var toCalendarName = 'Calendar2';

  // Move from start of fromYear to start of toYear (for month 0 = Jan, 1 = Feb...)

  var fromCalendar = CalendarApp.getCalendarsByName(fromCalendarName)[0];
  var toCalendar = CalendarApp.getCalendarsByName(toCalendarName)[0];

  var fromCalendarId = fromCalendar.getId();
  var toCalendarId = toCalendar.getId();
  Logger.log(fromCalendarId);
  Logger.log(toCalendarId);

  var events = fromCalendar.getEvents(fromDate, toDate);
  for(var i=0; i<events.length;i++){
    var evId = events[i].getId().replace("@google.com", "");
    Logger.log(evId); // show event Id in log
    Calendar.Events.move(fromCalendarId, evId, toCalendarId);  
  }
}

如果要从Google日历中手动创建要移动的事件,则上述代码可以正常工作。

但是,当要移动的事件在ical / ics文件中外部创建,然后导入到Google日历中时,代码将失败。

运行代码时,出现以下错误:

API call to calendar.events.move failed with error: Not Found (line 86, file "Code")

其中第86行是Calendar.Events.move的行。

请注意日志显示:

[20-04-24 01:26:15:031 EDT] myname@gmail.com
[20-04-24 01:26:15:032 EDT] asfdsfdsfdsfekwlkkllkpauc700@group.calendar.google.com
[20-04-24 01:26:15:986 EDT] myeventidprefix-a3a597f53ff059959e950fc513df33af

一切似乎都是“正确的”,确实事件ID恰好是我在随后导入的ics文件中在外部创建的UID。

尽管如此,Calendar.Events.move似乎无法在fromCalendar中找到事件本身。

你知道这里出了什么问题吗?

我注意到的第二个问题是,即使例程正常运行(例如,针对Google日历中创建的事件),“通知”也不会移动。即,如果我在fromCalendar中创建带有通知的事件,则toCalendar中移动的事件会丢失通知。请注意,两个日历通常都没有启用“事件”或“全天”通知。

有趣的是,如果我将同一事件从Calendar移回日历,则通知会神奇地重新出现。

所以所有知道为什么通知在内部仍然完好无损但与其他事件数据不可见的想法

1 个答案:

答案 0 :(得分:0)

好的-我解决了第一部分。 问题在于,对于导入的iCal事件,iCal UID与Google事件ID不同。特别是,.getId()返回iCal UID,而Calendar.Events.move函数需要Google事件ID,可以通过以下方式检索该事件:Calendar.Events.list(fromCalendarId).items

请参阅:How can I find the Event Id of my Google Calendar event?

这当然不是本地事件的问题,因为ID相同,这说明了为什么我的原始代码适用于本地事件。

修改后的代码如下:

 for(var i=0; i<events.length; i++){
    var evId = events[i].id;
    Logger.log(i + ": " + evId); // show event Id in log
    Calendar.Events.move(fromCalendarId, evId, toCalendarId);  //Note need to turn on Calendar API under Resources
  }

但这会移动一些但不是全部的事件,这很奇怪...而且我看不到任何模式...的确,在许多类似事件中,有些移动了,而另一些却没有。

(此外,如上所述,通知不会移到前面。)