如何用Google Apps Script判断指定Google日历是否设为公开?
我明白你的问题了——你用Calendar.CalendarList.list()只能拿到日历的基本信息,但找不到判断公开状态的字段对吧?这是因为CalendarList接口返回的是用户已添加到侧边栏的日历列表元数据,并不包含完整的权限配置信息。
要判断日历是否公开,你需要结合日历详情接口或者**访问控制列表(ACL)**来检查,下面给你两种可行的方案和修改后的代码:
方案1:通过日历详情的visibility字段判断
Calendar.Calendars.get(calendarId)会返回日历的完整详情,其中visibility字段直接标识了日历的可见性:
public:日历完全公开,任何人都能查看private:仅授权用户可见- 其他值(如
restricted):有限制的可见性
方案2:通过ACL检查公共访问权限
日历的公开本质是给所有未登录的匿名用户(scope.type = "default")分配了reader权限,所以遍历日历的ACL规则就能确认这一点,这种方法更精准,因为有些日历可能通过自定义ACL设置公开,而visibility字段不一定同步更新。
修改后的完整代码
function checkCalendarPublicStatus() { var pageToken; do { // 获取用户的日历列表 const calendarList = Calendar.CalendarList.list({ maxResults: 100, pageToken: pageToken }); if (calendarList.items && calendarList.items.length > 0) { for (const calendar of calendarList.items) { // 方法1:通过visibility字段判断 const calendarDetails = Calendar.Calendars.get(calendar.id); const isPublicByVisibility = calendarDetails.visibility === 'public'; // 方法2:通过ACL规则判断 let isPublicByAcl = false; const aclRules = Calendar.Acl.list(calendar.id); if (aclRules.items) { for (const rule of aclRules.items) { // 检查是否存在给所有匿名用户的可读权限 if (rule.scope.type === 'default' && rule.role === 'reader') { isPublicByAcl = true; break; } } } // 打印结果 Logger.log(`日历名称: ${calendar.summary} (ID: ${calendar.id})`); Logger.log(`通过可见性字段判断是否公开: ${isPublicByVisibility}`); Logger.log(`通过ACL权限判断是否公开: ${isPublicByAcl}`); Logger.log('------------------------'); } } else { Logger.log('未找到任何日历。'); } pageToken = calendarList.nextPageToken; } while (pageToken); }
注意事项
- 确保你已经在Google Apps Script编辑器中启用了高级Calendar服务(之前用
Calendar.CalendarList应该已经启用了,不过如果报错可以再检查一下:点击「资源」→「高级Google服务」,找到Calendar服务并开启)。 - 第一次运行脚本时需要授权,确保你授权了足够的权限来访问日历详情和ACL。
内容的提问来源于stack exchange,提问作者Justin Keene
相关产品推荐
相关产品推荐

