【问题标题】:Google scripts moving events between calendars: Calendar.Events.move can't find event谷歌脚本在日历之间移动事件:Calendar.Events.move 找不到事件
【发布时间】:2020-04-24 05:32:42
【问题描述】:

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

我正在尝试使用 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 中移动的事件会丢失通知。请注意,这两个日历通常都没有开启事件或“全天”通知。

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

所以知道为什么通知在内部看起来仍然完好无损,但与其他事件数据一起不可见

【问题讨论】:

  • 这个帖子对您的情况有用吗? stackoverflow.com/q/48134986/7108653
  • 不幸的是,这没有帮助。我的活动中没有额外的“@google.com”文本。所以添加 .replace("@google.com", "") 没有任何作用。
  • 请注意,如果我从 非默认 日历移动,我刚刚发现我的代码确实 工作。但是当“发件人”日历是默认日历“myname@gmail.com”时,它会失败
  • 感谢您的回复。我深表歉意,我的评论对您的情况没有用处。当getId() 检索到默认日历和其他日历的事件ID 时,将返回类似#####@google.com 的值。所以当使用Calendar.Events.move(fromCalendarId, ev.getId(), toCalendarId); 时,就会出现你的问题的错误。当使用Calendar.Events.move(fromCalendarId, ev.getId().replace("@google.com", ""), toCalendarId); 时,默认日历和其他日历的fromCalendar 都不会出现错误。很抱歉,我无法复制您的问题。
  • 那么,您能否通过反映我的评论来提供复制当前问题的详细流程?借此,我想确认一下。

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


【解决方案1】:

好的 - 我解决了第一部分。 问题是对于导入的 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
  }

然而,这会移动一些但不是所有奇怪的事件......而且我没有看到任何模式......事实上,在许多类似的事件中,一些被移动,而另一些则没有。

(另外,如上所述,通知不会像前面提到的那样移动。)

【讨论】:

  • 请注意,如果我对事件 for 循环进行一些“节流”,看起来我可以将其全部复制。例如:`if (i % 25 == 0) {Utilities.sleep(1000);}
猜你喜欢
  • 2012-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多