我有一个脚本,可以添加新行并以某种方式更改工作表。我想锁定此工作表,使其无法手动编辑,但允许运行脚本。
有没有办法做到这一点?
是的,这不是最容易做的事情,但它是可能的。
但在我们开始之前,了解 Google 电子表格/工作表保护的工作原理很重要。
无法保护工作表或范围免受文件所有者的侵害。因此,如果您还想保护自己的文件(假设您是所有者)。那么现在唯一可用的解决方案(我希望他们将来会更改此设置)是将文件的所有权更改为另一个帐户。大多数人所做的是使用另一个他们不经常使用的 Google 帐户(如果您还没有,您可以轻松创建一个虚假帐户)。
然后,在您将文件传输到另一个帐户后,您可以使用常规 GUI 轻松锁定对范围、工作表或整个电子表格的更改。
好的,现在到脚本。当一个脚本运行时,它总是使用特定账户的授权,它可以做这个账户能做的一切。例如,当有人直接从脚本编辑器运行脚本时,或者单击自定义菜单或图像时:它会在点击者的帐户下运行。但是如果你设置了一个可安装的触发器,那么脚本总是在谁首先设置触发器的帐户下运行(而不是谁在执行实际触发它的操作)。简单的事件触发器作为触发操作的人运行(您可以匿名思考),但它们不能做太多事情,这是一项安全功能(阅读链接以获得更好的理解)。
最后,当将脚本发布为 Web 应用程序时,会有一个选择框来选择脚本是作为开发人员运行还是作为用户运行。很简单。
回到问题。由于我们已将所有人锁定在所需的工作表/范围内。对于要更改此锁定区域的脚本,它必须以文件所有者身份运行!
如果您所做的更改是自动的,例如通过可安装的触发器,那么您很好。只需使用文件所有者帐户设置触发器即可。此外,如果您的用户正在“外部”访问脚本,即通过网络应用程序。那么这很容易,只需将网络应用程序设置为以开发人员(文件所有者)身份运行。
最复杂的情况是,如果您需要从自定义菜单运行脚本,该脚本将在单击它的人的权限下运行,而这些用户本身无法对受保护区域进行更改。对此的解决方案是将脚本部署为作为开发人员运行的 web 应用程序,并通过单击按钮运行函数以使用UrlFetch调用部署的 url ,可能传递一些参数来指定需要做什么。然后,由于 webapp 作为开发人员(即文件所有者)运行,它可以进行任何所需的更改,并返回(如果有要返回的内容)任何值(通常是 JSON)到调用函数(它作为用户并与他的会话相关联),因此您可以在弹出窗口或烤面包机等上向他显示消息。
这有点棘手,但效果很好,您可以在电子表格中包含的同一个脚本上完成所有这些工作。但是,如果您担心您的用户可能会访问脚本编辑器并更改代码(这是可能的),那么您应该将 web-app 部分分隔在不同的文件中,您不需要与他们共享。
是的,但仅适用于其他人,而不适用于脚本所有者。只需使用 2 个帐户,一个作为所有者,另一个作为读者。