从CalendarApp访问隐藏的Google日历?

时间:2015-09-03 18:58:28

标签: google-apps-script

我有一个创建隐藏日历的网络应用

var cal = CalendarApp.createCalendar("Timetable");
cal.setSelected(true);
cal.setHidden(true); 

但是,相同的网络应用程序从代码开始,以查找现有日历并首先将其删除

var cals = CalendarApp.getCalendarsByName("Timetable");
for (var i = cals.length; i--; ) {
  cals[i].deleteCalendar();
}

但是,CalendarApp.getCalendarsByName找不到“时间表”日历。

我也试过

var cals = CalendarApp.getAllCalendars();
for (var i = cals.length; i--; ) {
  if (cals[i].getName()=='Timetable') {
    cals[i].deleteCalendar();
  }
}

var cals = CalendarApp.getAllOwnedCalendars();
for (var i = cals.length; i--; ) {
  if (cals[i].getName()=='Timetable') {
    cals[i].deleteCalendar();
  }
}

其中任何一个都无法找到名为“时间表”的日历。

但是,新日历已正确创建并在日历设置下的UI中列出,如果我选中该框以使其再次可见,则此代码的所有版本都会找到“时间表”日历并将其删除,然后再创建新的。

有没有人对如何根据其名称获取隐藏日历的处理方式有任何想法?

我的网络应用程序以访问脚本的人身份执行,并在用户自己的Google日历中创建此辅助日历。

1 个答案:

答案 0 :(得分:0)

我不认为这可以使用Apps Script内置的Calendar API(CalendarApp)。

您必须直接使用实际的Calendar API。幸运的是,它可以作为“高级服务”使用(在您的脚本中,请参阅菜单资源>高级Google服务,按照说明操作并启用Calendar API)。

以下是按名称获取隐藏日历的代码段:

function getCalIdFromName(name) {
  var cals = Calendar.CalendarList.list({showHidden:true,
               minAccessRole:'owner', fields:'items(id,summary)'}).items;
  for( var i = 0; i < cals.length; i++ )
    if( cals[i].summary == name )
      return cals[i].id;
  return null;
}

function deleteTimetable() {
  Calendar.Calendars.remove(getCalIdFromName('Timetable'));
}

尝试限制CalendarList结果我包含了仅返回用户自己的日历的条件。因为这似乎是你的场景,但你可以省略它来检索所有。

另一个警告,这个简单的代码不处理分页。希望您的用户不会拥有超过100个日历(这需要分页控制)。

无论如何,使用Properties Service创建日历ID后,可能更容易存储日历ID。然后在需要删除或操作时通过id检索它(也因为用户可能会更改日历名称)。