【发布时间】:2013-01-11 05:07:48
【问题描述】:
使用 Google Apps 脚本,我创建了一个包含复杂重复事件的日历。但是,我无法将该事件作为重复事件复制到另一个日历。 注意:循环规则不能通过网页界面生成或编辑。
举个真实的例子,假设用户想要从this publicly shared Google calendar 复制重复事件。该事件是一种模板事件,用于我的大学星期四课程的课程安排。
有两个困难阻止用户将重复事件复制到用户有权访问的另一个日历中:
- 单击事件实例并说“复制到我的日历”只会复制该单个事件,即使该事件被定义为重复。这不是一个好的解决方案,因为用户必须这样做 10 次以上才能获得一个学期的所有事件。
- 单击事件实例,然后单击“更多详细信息”,然后尝试在“更多操作”菜单(其中 xxxx 是用户拥有的日历)下尝试“复制到 xxxx”似乎可以工作。但是,点击保存时出现错误:“出现错误,请稍后再试。”
编辑这是活动在 Google 日历中的样子的屏幕截图(点击活动,“更多详细信息”)。
请注意,从学期开始到学期末的每个星期一都会定期举行此活动,但有几个例外。没有假期(例如,Mon 2013-02-25),但也包括 Wed 2013-02-27,课程将在哪一天提供,就好像它是星期一(根据大学课程安排)。
我再说一遍:重复活动在 Google 日历中看起来不错,但无法将它们完全复制到另一个日历中。
创建日历的 GAS 函数(并非所有代码都在这里):
function createCalendar(calendarName, courseCode, weekday, times, room, isLab) {
Logger.log("最后一天:" + LAST_TRIMESTER_DATE);
// 修改最后一天,使其不是午夜,而是在第二天之前,即 23:59:59
varadjustedLastDay = LAST_TRIMESTER_DATE;
adjustedLastDay.setTime(adjustedLastDay.getTime() + (23*60*60*1000) + (59*60*1000) + (59*1000));
Logger.log("调整的最后一天:" +adjustedLastDay);
var eventRecurrence = CalendarApp.newRecurrence();
eventRecurrence.addDailyRule().until(adjustedLastDay).interval(1).onlyOnWeekday(weekday);
// 获取第一天的星期几
var weekdayOfFirstDay = Utilities.formatDate(FIRST_TRIMESTER_DATE, LONG_TIME_ZONE, "EEEE").toUpperCase();
// 如果此日历用于实验室,则排除第一周的天数
如果(isLab){
eventRecurrence.addDailyExclusion().times(1);
} 别的 {
// 这是一门课程,所以如果不是课程日,则排除第一天
// -- 这是一种错误,因为事件的“第一天”总是会尝试创建,即使它没有指定“onlyOnWeekday”
if (weekdayOfFirstDay != weekday.toString()) {
eventRecurrence.addDailyExclusion().times(1);
// eventRecurrence.addDateExclusion(FIRST_TRIMESTER_DATE);
}
}
// 排除所有假期
for (var i = 0; i
【问题讨论】:
-
到目前为止,您使用 Google Apps 脚本做了什么?
-
@JacobJanTuinstra 你的意思是,我使用什么 API 调用来创建事件?
-
是的。你认为 GAS 会解决它吗?
-
GAS 正好可以创建事件。当我有时间时,我会尝试发布它。然而,我的用例是用户不运行任何 GAS 来将这些特制事件“复制”到他们的日历中。使用 GAS 是因为复现的复杂性。例如,这条规则规定,课程是在学期开始和结束之间的每个星期一,除了假期列表,包括任何其他应该像星期一一样上课的日子。 (是的,我的大学有复杂的日历时间表)。我怀疑“复制”仅适用于简单的重复事件。
-
如果您使用的是 Google 协作平台,那么您可以在日历下方创建一个按钮来添加所有重复发生的事件(说起来容易做起来难...)?
标签: google-apps-script google-calendar-api google-calendar-recurring-events