您需要清楚哪些标准可以确定您的“安装”事件之一是否已经在 InstallCalendar 上。由于您的意图是复制原始事件的副本,因此我们不能期望事件 ID 会相同。 (但是,如果您邀请改为使用 InstallCalendar,它会 - 更好的是,重新安排会自动反映。)
我们可以假设匹配主题中的“安装”+相同的开始时间就足够了。但是,在一个日历上重新安排时间会在另一个日历上孤立该事件,从而导致重复。
更好的选择是将自定义标记应用到 InstallCalendar 中的事件,为方便起见将其设置为原始事件的 ID。然后我们只需要搜索所有先前设置的标签,寻找来自my_calendar 的事件ID 的匹配项。为此,我们可以构建一个包含这些标签的数组:
// build array of event tags for comparison
var install_event_Tags = [];
install_events.forEach( function (event) {
install_event_Tags.push(event.getTag('origID'));
});
完成后,我们将确保我们只复制一次事件:
...
my_install_events.forEach( function (event) {
// if it doesn't exist in install_events, create a new event
var eventId = event.getId();
var match = install_event_Tags.indexOf(eventId);
if (match === -1) {
// Duplicate the event from my_calendar
var newEvent = install_calendar.createEvent(event.getTitle(), event.getStartTime(), event.getEndTime());
// Apply a tag with original event ID
newEvent.setTag('origID', eventId);
}
});
其他问题
您的代码中似乎还有其他问题需要解决。
-
在检索my_install_events 时,您将打开共享的example 日历,该日历稍后也用于install_events。
// get my calendar to see whether I have install events scheduled
var my_calendar = CalendarApp.getDefaultCalendar();
var my_install_events =
CalendarApp.getCalendarById('example@group.calendar.google.com').getEvents(now, later, {search: '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'});
^^^^^^^^^^^
-
本身不是错误,但重复调用 getCalendarById 会减慢您的代码速度。既然你已经算好了install_calendar,那就用吧。
// 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'});
^^^^^^^^^^^^^^^^
最终脚本
function copyInstalls(){
var now = new Date();
var later = new Date("January 1, 2015 08:00:00 PDT"); // be lazy for now
// 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'});
// 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'});
// build array of event tags for comparison
var install_event_Tags = [];
install_events.forEach( function (event) {
install_event_Tags.push(event.getTag('origID'));
});
my_install_events.forEach( function (event) {
// if it doesn't exist in install_events, create a new event
var eventId = event.getId();
var match = install_event_Tags.indexOf(eventId);
if (match === -1) {
// Duplicate the event from my_calendar
var newEvent = install_calendar.createEvent(event.getTitle(), event.getStartTime(), event.getEndTime());
// Apply a tag with original event ID
newEvent.setTag('origID', eventId);
}
});
}
后续步骤
此脚本将制作从my_calendar 到InstallCalendar 的安装事件的唯一副本。这可能足以满足您的需求。但是,您可能需要考虑其他情况:
- 如果安装事件存在于
InstallCalendar,但被重新安排了怎么办?
- 如果之前复制到
InstallCalendar 的事件从my_calendar 中删除怎么办?
- 如果之前复制到
InstallCalendar 的事件在那里被删除了怎么办?当前脚本会再次复制它,但可能希望的行为也是将其从 my_calendar 中删除。