如何合并2个谷歌日历以按顺序显示事件?

时间:2012-07-26 14:45:51

标签: calendar google-apps-script google-sites

我正在尝试使用我自己通过谷歌脚本创建的显示替换googlesite中笨重的谷歌日历议程视图。

我可以在页面上获取活动详细信息,但我需要显示多个日历 - 如何确保项目在页面上按正确顺序排列,并且不按日历分组?

我可以:

每次运行脚本时创建一个临时日历,合并多个日历(注意 - 我看不到任何创建日历选项)

或将信息转储到电子表格,然后从那里进行排序

或以某种方式按时间循环,而不是日历。

我认为电子表格是最好的选择 - 任何其他想法?

是否有一种简单的方法可以将iCal文件自动复制到电子表格中?

乔治

2 个答案:

答案 0 :(得分:0)

如果PHP和Zend Gdata库是一个选项,您可以获取日历列表提要,然后遍历每个日历的事件并将它们放入一个数组中。之后,您可以按照开始时间对它们进行排序:

     function cmp( $a, $b )
     {
        if(  $a->when[0]->startTime ==  $b->when[0]->startTime ){ return 0 ; }
        return ($a->when[0]->startTime < $b->when[0]->startTime) ? -1 : 1;
     }

     uasort($allEvents,'cmp');

答案 1 :(得分:0)

我已经解决了很多这个问题。特别是在我的多个日历上发送活动的访客列表电子邮件时。下面的函数将采用一系列日历以及开始和结束时间,并将其转换为单个CalendarEvent个唯一对象数组。

您可以运行代码版本here。您还会发现它也会在那里发表评论。

排序部分是您最感兴趣的部分。它包含在byStart函数中。您可以在MDN Array.Sort Reference找到有关数组排序的更多信息。 byStart适用于任何CalendarEvent数组。

由于管理日历的清晰特性,Javascript中提供的迭代功能使这一功能变得轻松。 MDN在Iteration Methods

上有更多信息

这是:

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();
}