Google apps script 将事件从一个谷歌日历复制到另一个,无需重复

Google apps script 将事件从一个谷歌日历复制到另一个,无需重复,google-apps-script,google-calendar-api,Google Apps Script,Google Calendar Api,我正在努力在两个日历之间建立一些逻辑 拿我的日历, 如果事件标题包含安装, 在InstallCalendar上创建事件。 在检索了两个日历后,我被卡住了。我不知道如何优雅地添加我在底部评论中的逻辑 功能复制安装{ var now=新日期; var later=新日期2015年1月1日08:00:00 PDT;//暂时懒惰 //获取日历以查看是否已安排安装事件 var my_calendar=CalendarApp.getDefaultCalendar; var my\u install\u事件=

我正在努力在两个日历之间建立一些逻辑

拿我的日历, 如果事件标题包含安装, 在InstallCalendar上创建事件。 在检索了两个日历后,我被卡住了。我不知道如何优雅地添加我在底部评论中的逻辑

功能复制安装{ var now=新日期; var later=新日期2015年1月1日08:00:00 PDT;//暂时懒惰 //获取日历以查看是否已安排安装事件 var my_calendar=CalendarApp.getDefaultCalendar; var my\u install\u事件= CalendarApp.getCalendarById'example@group.calendar.google.com'.getEventsnow,稍后,{search:'Install'}; //挂起安装事件日历 var install\u calendar=CalendarApp.getCalendarById'example@group.calendar.google.com'; var install_events=CalendarApp.getCalendarById'example@group.calendar.google.com'.getEventsnow,稍后,{search:'Install'}; 对于my_install_事件中的var事件{ //如果它不存在于install_events中,请创建一个新事件 //不知道怎么做这部分 } }
您需要明确哪些标准可以识别某个安装事件是否已在InstallCalendar上。由于您的目的是复制原始事件的副本,因此我们不能期望事件ID相同。但是,如果您邀请InstallCalendar,它将是-更好的是,重新安排将自动反映

我们可以假设在主题中匹配的安装+相同的开始时间足以匹配。但是,在一个日历上重新安排会使另一个日历上的活动孤立,从而导致重复

更好的选择是对InstallCalendar中的事件应用自定义标记,为方便起见,将其设置为原始事件的ID。然后我们只需要搜索所有之前设置的标记,从my_calendar中查找事件ID的匹配项。为了做好准备,我们可以构建这些标记的数组:

//构建用于比较的事件标记数组 var install_event_Tags=[]; 安装\u events.forEach函数事件{ 安装事件标签.pushevent.getTag'origID'; }; 完成后,我们将如何确保只复制一次事件:

... my_install_events.forEach函数事件{ //如果它不存在于install_events中,请创建一个新事件 var eventId=event.getId; var match=install\u event\u Tags.indexofended; 如果匹配==-1{ //从我的日历复制事件 var newEvent=install_calendar.createEventevent.getTitle、event.getStartTime、event.getEndTime; //应用具有原始事件ID的标记 setTag'origID',eventId; } }; 其他问题 代码中似乎还有其他问题需要解决

检索my_install_事件时,您正在打开共享示例日历,该日历稍后也用于install_事件

也许你的意思是

  // get my calendar to see whether I have install events scheduled 
  var my_calendar = CalendarApp.getDefaultCalendar();
  var my_install_events = my_calendar.getEvents(now, later, {search: 'Install'});
                          ^^^^^^^^^^^
这本身不是一个bug,但是重复调用getCalendarById会降低代码的速度。既然您已经计算了安装日历,不妨使用它

// snag the Installation Events calendar 
var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
var install_events = CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});  
更容易维护:

// snag the Installation Events calendar 
var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
var install_events = install_calendar.getEvents(now, later, {search: 'Install'});  
                     ^^^^^^^^^^^^^^^^
定稿 功能复制安装{ var now=新日期; var later=新日期2015年1月1日08:00:00 PDT;//暂时懒惰 //获取日历以查看是否已安排安装事件 var my_calendar=CalendarApp.getDefaultCalendar; var my_install_events=my_calendar.getEventsnow,稍后,{search:'install'}; //挂起安装事件日历 var install\u calendar=CalendarApp.getCalendarById'example@group.calendar.google.com'; var install_events=install_calendar.getEventsnow,稍后,{search:'install'}; //构建用于比较的事件标记数组 var install_event_Tags=[]; 安装\u events.forEach函数事件{ 安装事件标签.pushevent.getTag'origID'; }; my_install_events.forEach函数事件{ //如果它不存在于install_events中,请创建一个新事件 var eventId=event.getId; var match=install\u event\u Tags.indexofended; 如果匹配==-1{ //从我的日历复制事件 var newEvent=install_calendar.createEventevent.getTitle、event.getStartTime、event.getEndTime; //应用具有原始事件ID的标记 setTag'origID',eventId; } }; } 下一步 此脚本将把安装事件从my_calendar复制到InstallCalendar。这可能足以满足您的需要。但是,您可能还需要考虑其他情况:

如果InstallCalendar中存在安装事件,但已重新安排,该怎么办? 如果以前复制到InstallCalendar的事件从我的日历中删除,该怎么办? 如果先前复制到InstallCalendar的事件在那里被删除,该怎么办?当前脚本将再次复制它,但可能需要的行为是将其从我的日历中删除。
你需要弄清楚什么样的标准可以识别什么 其中一个安装事件已在InstallCalendar上。由于您的目的是复制原始事件的副本,因此我们不能期望事件ID相同。但是,如果您邀请InstallCalendar,它将是-更好的是,重新安排将自动反映

我们可以假设在主题中匹配的安装+相同的开始时间足以匹配。但是,在一个日历上重新安排会使另一个日历上的活动孤立,从而导致重复

更好的选择是对InstallCalendar中的事件应用自定义标记,为方便起见,将其设置为原始事件的ID。然后我们只需要搜索所有之前设置的标记,从my_calendar中查找事件ID的匹配项。为了做好准备,我们可以构建这些标记的数组:

//构建用于比较的事件标记数组 var install_event_Tags=[]; 安装\u events.forEach函数事件{ 安装事件标签.pushevent.getTag'origID'; }; 完成后,我们将如何确保只复制一次事件:

... my_install_events.forEach函数事件{ //如果它不存在于install_events中,请创建一个新事件 var eventId=event.getId; var match=install\u event\u Tags.indexofended; 如果匹配==-1{ //从我的日历复制事件 var newEvent=install_calendar.createEventevent.getTitle、event.getStartTime、event.getEndTime; //应用具有原始事件ID的标记 setTag'origID',eventId; } }; 其他问题 代码中似乎还有其他问题需要解决

检索my_install_事件时,您正在打开共享示例日历,该日历稍后也用于install_事件

也许你的意思是

  // get my calendar to see whether I have install events scheduled 
  var my_calendar = CalendarApp.getDefaultCalendar();
  var my_install_events = my_calendar.getEvents(now, later, {search: 'Install'});
                          ^^^^^^^^^^^
这本身不是一个bug,但是重复调用getCalendarById会降低代码的速度。既然您已经计算了安装日历,不妨使用它

// snag the Installation Events calendar 
var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
var install_events = CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: 'Install'});  
更容易维护:

// snag the Installation Events calendar 
var install_calendar = CalendarApp.getCalendarById('example@group.calendar.google.com');
var install_events = install_calendar.getEvents(now, later, {search: 'Install'});  
                     ^^^^^^^^^^^^^^^^
定稿 功能复制安装{ var now=新日期; var later=新日期2015年1月1日08:00:00 PDT;//暂时懒惰 //获取日历以查看是否已安排安装事件 var my_calendar=CalendarApp.getDefaultCalendar; var my_install_events=my_calendar.getEventsnow,稍后,{search:'install'}; //挂起安装事件日历 var install\u calendar=CalendarApp.getCalendarById'example@group.calendar.google.com'; var install_events=install_calendar.getEventsnow,稍后,{search:'install'}; //构建用于比较的事件标记数组 var install_event_Tags=[]; 安装\u events.forEach函数事件{ 安装事件标签.pushevent.getTag'origID'; }; my_install_events.forEach函数事件{ //如果它不存在于install_events中,请创建一个新事件 var eventId=event.getId; var match=install\u event\u Tags.indexofended; 如果匹配==-1{ //从我的日历复制事件 var newEvent=install_calendar.createEventevent.getTitle、event.getStartTime、event.getEndTime; //应用具有原始事件ID的标记 setTag'origID',eventId; } }; } 下一步 此脚本将把安装事件从my_calendar复制到InstallCalendar。这可能足以满足您的需要。但是,您可能还需要考虑其他情况:

如果InstallCalendar中存在安装事件,但已重新安排,该怎么办? 如果以前复制到InstallCalendar的事件从我的日历中删除,该怎么办? 如果先前复制到InstallCalendar的事件在那里被删除,该怎么办?当前脚本将再次复制它,但可能需要的行为是将其从我的日历中删除。
我有同样的想法/需要,但我不知道从哪里开始,否则我可能会对你有更多帮助。我创建了一个新的线程,也许我可以得到一些有用的信息,你可以使用,也许没有。我有同样的想法/需要,但我不知道从哪里开始,否则我可能会对你有更多帮助。我创建了一个新的线程,也许我可以得到一些有用的信息,你可以使用,也许没有。哇,谢谢你,莫格斯达。本演练非常精彩。我意识到我需要解决的问题只是场景的一部分,你的下一步就要完成了。干杯哇,谢谢你,莫格斯达。本演练非常精彩。我意识到我需要解决的问题只是场景的一部分,你的下一步就要完成了。干杯