我正在尝试用我自己通过谷歌脚本创建的显示替换我的谷歌网站中笨重的谷歌日历议程视图。
我可以在页面上获取活动详细信息,但我需要显示多个日历 - 如何确保项目在页面上按正确顺序排列,并且不按日历分组?
我可以:
每次运行脚本时创建一个临时日历,合并多个日历(注意 - 我看不到任何创建日历选项)
或将信息转储到电子表格,然后从那里进行排序
或者以某种方式按时间循环,而不是日历。
我认为电子表格是最好的选择——还有其他想法吗?
有没有一种简单的方法可以自动将 iCal 文件复制到电子表格中?
乔治
我正在尝试用我自己通过谷歌脚本创建的显示替换我的谷歌网站中笨重的谷歌日历议程视图。
我可以在页面上获取活动详细信息,但我需要显示多个日历 - 如何确保项目在页面上按正确顺序排列,并且不按日历分组?
我可以:
每次运行脚本时创建一个临时日历,合并多个日历(注意 - 我看不到任何创建日历选项)
或将信息转储到电子表格,然后从那里进行排序
或者以某种方式按时间循环,而不是日历。
我认为电子表格是最好的选择——还有其他想法吗?
有没有一种简单的方法可以自动将 iCal 文件复制到电子表格中?
乔治
我已经处理了很多。尤其是在为我的多个日历上的事件发送宾客列表电子邮件时。下面的函数将获取一组日历以及一个开始和结束时间,并将其转换为一个唯一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();
}
如果 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');