Apps 脚本需要用户授权才能访问内置 Google 服务或高级 Google 服务中的私密数据。
Google 服务的授权方式
当脚本需要访问 Google 服务时,它会遵循以下一般流程:
- 检测:Apps 脚本会扫描脚本,以确定其使用的服务(例如
SpreadsheetApp或GmailApp)。 - 范围确定:根据扫描结果,Apps 脚本会确定脚本运行所需的一组 OAuth 范围。
- 授权检查:脚本运行时,会检查用户是否已授权这些范围。
- 用户提示:如果缺少授权,系统会显示一个对话框,要求用户授予权限。
- 执行:获得脚本授权后,该脚本便可访问相应用户的所请求数据。
权限和脚本类型
脚本运行所用的用户身份(以及脚本可访问的数据)因脚本运行的场景而异,如下表所示。
| 脚本类型 | 脚本运行身份... |
|---|---|
| 独立型、插件或 与 Google 文档、表格、幻灯片或表单绑定的脚本 | 使用键盘的用户 |
| 电子表格中的自定义函数 | 匿名用户;但是,配额限制 会针对键盘前的用户进行统计 |
| Web 应用或 Google 协作平台信息块 | 键盘用户或脚本所有者,具体取决于部署应用时选择的选项 |
| 可安装的触发器 | 创建触发器的用户 |
授予访问权限
Apps 脚本会根据代码扫描结果自动确定授权范围(例如访问您的 Google 表格文件或 Gmail)。被注释掉的代码仍可生成授权请求。如果脚本需要授权,那么在运行该脚本时,您会看到此处显示的某个授权对话框。
如果代码更改添加了新服务,您之前授权的脚本也会要求您提供额外的授权。如果您以在脚本所有者的用户身份下运行的 Web 应用的形式访问脚本,则脚本可能不会请求授权。
撤消访问权限
如需撤消脚本对您数据的访问权限,请按以下步骤操作:
- 访问 Google 账号的权限页面。(如需日后前往此页面,请访问 Google.com,然后点击屏幕右上角的账号照片。接下来,依次点击我的账号、“登录和安全”部分下的关联的应用和网站,然后点击管理应用。)
- 点击要撤消授权的脚本的名称,然后点击右侧的移除,接着在显示的对话框中点击确定。
将范围限制为当前文档
如果您要构建使用电子表格服务、文档服务、幻灯片服务或表单服务的插件或其他脚本,则可以强制授权对话框仅请求访问使用该插件或脚本的文件,而不是用户的所有电子表格、文档或表单。为此,请在文件级注释中添加以下 JsDoc 注释:
/**
* @OnlyCurrentDoc
*/
如果您的脚本包含声明了 @OnlyCurrentDoc 的库,但主脚本实际上需要访问的不仅仅是当前文件,则可以使用相反的注释 @NotOnlyCurrentDoc。
插件的授权生命周期
Google 表格、Google 文档、Google 幻灯片和 Google 表单的插件通常遵循与绑定到文档的脚本相同的授权模型。不过,在某些情况下,它们的 onOpen(e) 和 onEdit(e) 函数会在无授权模式下运行,这会带来一些额外的复杂情况。如需了解详情,请参阅插件授权生命周期指南。
OAuth 应用用户数上限
使用 OAuth 访问 Google 用户数据的应用(包括 Apps 脚本项目)会受到授权限制。如需了解详情,请参阅 OAuth 应用用户限制。
使用 Apps 脚本时的重新验证行为
Apps 脚本不会强制执行您在 Google Cloud 服务设置中配置的重新身份验证频率。这是因为 Apps 脚本可以使用触发器自动运行,而触发器无需直接的用户互动即可运行。这些自动执行不会触发重新身份验证提示。在您指定的时间段(例如 12 小时)过后,您的 Apps 脚本应用不会自动要求您重新进行身份验证。
在清单中设置明确的范围
Apps 脚本会扫描代码中的函数调用,自动确定所需的范围。如果您需要更多控制权,可以在项目清单 (appsscript.json) 中明确设置范围。建议您为已发布的脚本执行此操作,以确保您使用的是所需的最低权限。
如需了解相关说明,请参阅设置明确的范围。
问题排查
- 运行触发器时出现“需要授权”错误:触发器必须由创建它们的用户授权。如果您添加的代码需要新的权限,则必须在脚本编辑器中手动运行一次函数,以触发授权对话框。
- 范围未更新:如果您已更新代码,但授权对话框未反映相应更改,请尝试保存项目并刷新编辑器。如果您在清单中使用显式范围,请确保已将新范围添加到
oauthScopes数组。 - “此应用已被屏蔽”或未经验证的应用警告:如果您的脚本使用敏感或受限范围,但尚未经过 Google 验证,就会出现此问题。请参阅 OAuth 客户端验证。