我正在尝试使用我自己通过谷歌脚本创建的显示替换googlesite中笨重的谷歌日历议程视图。
我可以在页面上获取活动详细信息,但我需要显示多个日历 - 如何确保项目在页面上按正确顺序排列,并且不按日历分组?
我可以:
每次运行脚本时创建一个临时日历,合并多个日历(注意 - 我看不到任何创建日历选项)
或将信息转储到电子表格,然后从那里进行排序
或以某种方式按时间循环,而不是日历。
我认为电子表格是最好的选择 - 任何其他想法?
是否有一种简单的方法可以将iCal文件自动复制到电子表格中?
乔治
答案 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();
}