如何保护 Google 电子表格中的 Apps 脚本代码?
Posted
技术标签:
【中文标题】如何保护 Google 电子表格中的 Apps 脚本代码?【英文标题】:How to protect the Apps Script code in a Google spreadsheet? 【发布时间】:2013-04-11 02:59:42 【问题描述】:我已经使用脚本编辑器为我的 Google 电子表格编写了一些代码。
我想与我的客户共享此电子表格,但我不想共享我编写的代码。
此代码向我的电子表格添加了一个菜单,其中包含有用的功能,当我的客户打开此电子表格并应用以下条件时应该工作/运行这些功能:他们不应该看到它的代码。
使用 Excel 很容易,但使用 Google 电子表格我不知道。 .我在谷歌上搜索了很多,但他们都给出了如何共享电子表格的想法。例如在“查看”模式下,但在这种情况下会出现问题:我的菜单功能(添加菜单)是“onOpen”,当我的客户打开它时不会启动。
如何在 Google 电子表格中实现这一点?
【问题讨论】:
您无法真正隐藏 GAS 代码。这是一个常见问题解答!可能重复Q14901758、Q15869708、Q11915118,可能还有更多。 您是否考虑过使用代码混淆或压缩工具? 这里是指向 Apps 脚本问题跟踪器的链接,以获取功能请求。请“star”这个问题以获得更多关注。 Link to Issue Tracker 【参考方案1】:使用库documentation 解释了如何使用它,the subject 上也有一个few interesting post
【讨论】:
只是为了清楚。使用库不会阻止代码被看到(尽管它会变得很困难),只是真正防止编辑。 是的,步入可以暴露库中的代码,但我想知道谷歌是否能够在脚本编辑器中提供至少一个密码保护级别,类似于 Excel 保护宏,以提供最低限度的保护还是不行? 库可能不适合 Best Practices 中指出的“大量 UI 脚本”。【参考方案2】:制作一个仅包含客户端脚本的特殊库文件。您的客户端必须至少具有读取级别的访问权限。所以他能够看到你的剧本。删除您的脚本并在该文件中创建一个新的无辜脚本并将其保存为新版本。现在您的客户只能看到这个新脚本。因为他的应用程序仍在使用旧版本的库,所以原始脚本将照常工作。
【讨论】:
这是个好主意,但还有其他事情必须做。您希望避免具有 VIEW 访问权限的用户可以在 Apps 脚本代码编辑器中打开脚本并查看版本历史记录并查看文件之前的更改的情况。为了解决这个问题,你可以用无意义的内容保存大量的更改,这会在版本历史中填充不可用的内容,并且与实际使用的代码无关。 但是即使您按照我上面的建议进行操作,仍然存在问题,因为任何具有 VIEW 访问权限的人都可以在代码编辑器中打开文件,然后查看版本历史记录。但也有办法解决这个问题。您对代码进行了大约 25 处更改和 25 次新保存。这会用不是您的代码的内容填充版本历史记录。版本历史对实际运行的代码无关紧要。实际上,如果库的用户使用调试器并单步执行代码,那么整个代码都会显示在代码编辑器中。因此,因此您无法保护它。【参考方案3】:简答
Publish您的脚本作为编辑器插件或 Google Workspace 插件。请注意,您可以将其设为私有,方法是选择不公开或仅对您的 G Suite/Google Workspace 组织可用。
说明
插件是在 2014 年添加的。这比使用库更好,因为您的插件不会共享任何内容。
请注意
无法使用 Chrome 开发者工具或其他类似软件访问 Google Apps 脚本服务器端代码。 附加组件有一些限制,请仔细研究它们,因为这个替代方案可能不适合您。 如今,插件需要 Google Cloud 项目和 oAuth 同意屏幕。如果插件将与外部用户共享,则需要 oAuth 验证和应用审核。如果您不适合作为插件发布,则您应该重新考虑您的解决方案,考虑使用 Web 应用程序,使用 Apps Script API 或 Google Sheets API。
参考文献
Get code from my google spreadsheet addon after publishing Google Apps Script Add-On Source Code/Security Build add-ons for Google Docs and Sheets Develop Add-ons for Google Sheets, Docs, Slides, Forms, and Gmail Developing Add-ons for G Suite G+ Community【讨论】:
我认为你的答案现在是最好的答案。我想对此表示赞同。如果有其他解决方法,虽然这取决于所有者想要运行的进程,但我曾想过使用 Web Apps。当用户运行一个函数时,该函数会从 Web 应用程序中检索结果并将它们显示在电子表格上。在这种情况下,用户使用的电子表格和部署 Web Apps 的项目是分开的。所以用户看不到Web Apps的脚本。 插件有一个时间驱动的触发限制,最多每小时一次。developers.google.com/apps-script/guides/triggers/installable ...这是一个烦人的限制。 G Suite 编辑器插件现在只能使用 G Suite Marketplace 发布。不幸的是,它不支持与群组共享和添加。【参考方案4】:除了脚本编辑器窗口中“发布”菜单下列出的选项外,以下 3 个选项还可以将代码保密给开发人员。 选项1: 将创建 3 个文件: 1.1 接收用户输入的电子表格,用作用户界面,并与用户共享。 1.2 一个独立的库脚本文件,用于接收来自 UI 电子表格的输入。 1.3 一个独立的私有脚本文件,用于处理库文件接收到的数据。
Option 1 Spreadsheet 此选项的参考是上述链接中的电子表格。 单击“提交”后,电子表格 ID 将发送到库脚本文件,并授予开发人员编辑权限。然后私有脚本文件打开文件并处理输入。 选项 2: 将创建 5 个文件 2.1 用作登录屏幕的电子表格。这是与用户共享的。 2.2 作为包含数据的实际应用程序的电子表格。一个用户界面。成功登录后,此电子表格可供用户使用。用户从此工作表中注销应用程序。 2.3 维护用户登录状态的电子表格。这是开发者私有的。 2.4 一个库脚本文件,用于更新上一步创建的电子表格中用户的登录状态,并更改对私有脚本文件的访问权限。此脚本文件作为库资源包含在登录电子表格和用户界面电子表格中。 2.5 处理在用户界面表中输入的数据的库脚本文件。此脚本文件包含开发人员想要保密的代码。此文件仅作为库资源包含在用户界面电子表格中。
Option 2 Spreadsheet 此选项的参考是上述链接中的电子表格。 当用户单击“开始”按钮时,用户在更新电子表格中的单元格值后登录到应用程序 2.3。包含私有代码的库脚本文件在使用 addViewer 方法成功登录后设置为可共享。应用程序的链接被呈现给用户并且用户在“登录”时与应用程序交互。当用户从应用程序注销时,将调用 removeViewer 方法再次将脚本文件设为私有。 在此选项中,用户在使用应用程序时可以访问私有代码文件。该文件可以通过使用计时器、脚本触发器、提示、警报等来保密。
在我的两个电子表格中,我使用设置为每分钟运行一次的基于时间的触发器来处理应用程序。这可能会导致输出延迟。触发器是在服务器端而不是在客户端创建的。
选项 3:私人共享文件夹 将创建 2 个文件: 3.1 接收用户输入的电子表格,用作用户界面,并与用户共享。 3.2 用于处理电子表格的独立私有脚本文件。
请参阅how to create a private shared folder 上的此链接。 在此选项中,用户看不到任何脚本。即使是共享电子表格也可能不包含代码。
【讨论】:
问题是所有库代码如果被共享都可以访问【参考方案5】:-
创建 2 个库;一个是虚拟的(我称之为 Lib1),另一个是包含所有密码的核心库(我称之为 Lib2)。
将 Lib2 作为库添加到 Lib1,并在其中使用在 Lib2 中完全实现的必要方法。
公开共享这两个库并将其权限设置为查看者。
从Lib1的分享设置页面,有一个齿轮符号。确保未选中以下选项“查看者和评论者可以看到下载、打印和复制的选项”
将 Lib1 添加到您客户的脚本(可能是电子表格脚本)中。
以编辑器或查看器的身份共享您客户端的脚本。
如果客户可以通过脚本的 Resources/Libraries 菜单访问 Lib1 ID,他将无法访问 Lib1 的 Resources/Libraries 菜单。由于第 4 步中未选中的选项,他也无法制作 Lib1 的另一个副本,从而使他无法看到 Lib2 的 ID。
【讨论】:
您是否验证了库代码在调试时没有显示,也没有使用 CLASP 下载?【参考方案6】:有一个类似的问题here。那里接受答案。
您可以创建一个独立的应用程序脚本项目。然后从您的 google sheet 脚本编辑器调用具有适当参数的独立应用程序脚本项目功能。这样,您在独立项目中的秘密将受到保护。
【讨论】:
以上是关于如何保护 Google 电子表格中的 Apps 脚本代码?的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格
仅通过 Google Apps 脚本值修改 Google 电子表格
Google Apps 脚本 - 将 gmail 中的数据提取到电子表格中
写入电子表格时强制使用 Google Apps 脚本中的小数位