【问题标题】:Google Doc: onOpen() doesn't execute in copied document+scriptGoogle Doc:onOpen() 不会在复制的文档+脚本中执行
【发布时间】:2013-10-09 22:50:14
【问题描述】:

我有一个带有关联容器绑定脚本的模板文档。该脚本不需要身份验证 - 它只是在 Google Docs UI 中创建一个自定义菜单。

模板文档归我的 GAE 网络应用所有。通过 Web 应用创建新文档使用以下过程:

  1. 在 Web 应用的服务帐户中复制模板。
  2. 使用用户提供的内容更新文档的 media_body;
  3. 插入权限以将用户设置为文档所有者;
  4. 删除与 Web 应用服务帐户关联的权限,以便文档对创建它的用户是私有的。

除了在脚本中执行 onOpen() 函数外,此过程按预期工作。脚本与文档一起成功复制,并且 onOpen() 可以手动运行(使用“脚本管理器”),但在打开文档时它不会自动执行。删除第 4 步可以解决问题,但这会使文档“不够私密”。

为什么 onOpen() 不在复制的私有文档中执行?

【问题讨论】:

  • 这很奇怪。您是说如果服务帐户是电子表格上的协作者,那么 onOpen 不会运行?您能否在 onOpen 运行良好的文档上运行一些额外的测试,例如将此服务帐户添加为协作者?
  • 不,反之亦然:onOpen() 在服务帐户作为协作者被删除后不会运行。

标签: google-app-engine google-apps-script


【解决方案1】:

这是因为原始的 onOpen 以原始所有者权限运行。当您从权限中删除该用户时,它将无法使用这些保存的凭据。 要么不要删除它,要么最好不要更改所有权,只需与用户共享。这也将使您拥有更多控制权,因为您将拥有创建的所有系统文件。

【讨论】:

  • 此选项不会强制创建文档的隐私。
  • 您会为此保留一个系统帐户。无法支持您想要的内容,因为脚本始终在授权帐户上运行(通过发布或批准 oauth 范围)。如果您从编辑器中删除已批准的帐户,Google 将不会在尚未批准在其帐户上运行的第一个脚本的用户上运行 onOpen。​​
  • 对于不访问用户数据的脚本是否不需要批准,例如添加自定义菜单的脚本?
  • 但是如果你进入“我所有的触发器”对话框,你也会看到你的 onOpen 作为触发器。它们是由原始所有者安装的,因此当您删除该用户时它们无法再运行。在没有访问权限的电子表格上安装触发器很奇怪。
  • 根据the documentation,“...如果 Bob 打开电子表格,那么 onOpen 函数将以 Bob 身份运行,无论是谁将脚本添加到电子表格中。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多