我已经处理了很多。尤其是在为我的多个日历上的事件发送宾客列表电子邮件时。下面的函数将获取一组日历以及一个开始和结束时间,并将其转换为一个唯一CalendarEvent
对象数组。
您可以在此处运行代码的一个版本。你还会发现那里也有评论。
排序部分是您似乎最感兴趣的部分。它包含在byStart
函数中。您可以在MDN Array.Sort 参考中找到有关数组排序的更多信息。byStart
适用于任何数组CalendarEvent
。
由于管理日历的列表性质,Javascript 中可用的迭代函数使这项工作变得轻松。MDN 有更多关于迭代方法的信息
这里是:
function mergeCalendarEvents(calendars, startTime, endTime) {
var params = { start:startTime, end:endTime, uniqueIds:[] };
return calendars.map(toUniqueEvents_, params)
.reduce(toSingleArray_)
.sort(byStart_);
}
function toCalendars_(id) { return CalendarApp.getCalendarById(id); }
function toUniqueEvents_ (calendar) {
return calendar.getEvents(this.start, this.end)
.filter(onlyUniqueEvents_, this.uniqueIds);
}
function onlyUniqueEvents_(event) {
var eventId = event.getId();
var uniqueEvent = this.indexOf(eventId) < 0;
if(uniqueEvent) this.push(eventId);
return uniqueEvent;
}
function toSingleArray_(a, b) { return a.concat(b) }
function byStart_(a, b) {
return a.getStartTime().getTime() - b.getStartTime().getTime();
}