我有一个创建隐藏日历的网络应用
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日历中创建此辅助日历。
答案 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检索它(也因为用户可能会更改日历名称)。