如何让Google Apps Script库的授权作用域被引用脚本正确继承?
问题1:是否可以通过脚本检测当前用户已授权的作用域,若缺少所需作用域则强制发起授权申请?
可以,实现逻辑如下:
- 第一步:在库代码中预先定义好所有需要的作用域常量:
const REQUIRED_SCOPES = [ "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/contacts", "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/script.external_request" ];
- 第二步:调用
ScriptApp.getScopes()获取当前父脚本已授权的所有作用域,和预设的必填作用域做比对,判断是否有缺失:
function checkScopes() { const currentScopes = ScriptApp.getScopes(); const missingScopes = REQUIRED_SCOPES.filter(scope => !currentScopes.includes(scope)); if (missingScopes.length > 0) { const authInfo = ScriptApp.getAuthorizationInfo(ScriptApp.AuthMode.FULL); if (authInfo.getAuthorizationStatus() === ScriptApp.AuthorizationStatus.REQUIRED) { throw new Error(`缺少必需授权作用域,请访问以下链接完成授权:${authInfo.getAuthorizationUrl()}\n需要添加的作用域列表:\n${JSON.stringify(missingScopes, null, 2)}`); } } }
- 第三步:在库所有对外暴露的方法开头都调用这个
checkScopes()校验方法,确保每次调用前都做权限校验。
问题2:是否可以让引用库的脚本自动继承库的权限配置?
默认不支持。Google Apps Script的权限体系以引用库的父脚本的权限配置为唯一标准,库自身的appsscript.json中声明的作用域、高级服务配置都不会自动同步到父脚本中。
可替代的低成本解决方案:
- 在库的使用说明中明确列出所有需要的作用域、需要开启的高级服务(本案例中为People API),用户导入库时直接复制配置到自身的
appsscript.json中即可。 - 在上述的
checkScopes()方法中直接生成父脚本可用的oauthScopes配置片段,用户无需手动整理,直接复制粘贴即可使用。 - 若你面向的是企业内部用户,可以将库封装为Workspace附加组件发布,用户安装附加组件时会一次性完成所有权限授权,不需要每个父脚本单独配置。
额外注意:除了作用域之外,父脚本还需要手动在「扩展-Apps脚本-服务」中添加People API高级服务,否则即使权限足够也会调用失败。
内容的提问来源于stack exchange,提问作者David Westwood
相关产品推荐
相关产品推荐

