首页 > 解决方案 > 关于扩展 GAS 电子表格有用性的问题

问题描述

我想提供在电子表格、TBA侧边栏中查看来自相同数据的输出的机会,理想情况下是另一种类型的 HTML 窗口,用于创建输出,例如,使用像THREE这样的 JavaScript 库。 我制作的非 Google 版本是一个带有 iframe 的网页,可以调整大小、拖动和打开/关闭,最重要的是,它们的内容在顶部窗口中共享相同的记录对象。因此,我相信,也许天真地,可以在这个既定且流行的应用程序中选择类似的东西。 至少,TBA 试验向我展示了查看和操作来自工作表或 TBA的信息很有用建模器输出传播输出. 导航大型建筑项目、克隆房间和楼层以及结合 JSON 记录(存储在诸如myjson 之类的存储库中)以进行协作工作的设施对我来说特别鼓舞人心。

我曾尝试将侧边栏用于不同的 HTML 文件,但只有一个保持打开状态这一事实并不是很有用,坦率地说,共享记录对象仍然超出我的能力范围。所以这是主要问题。谷歌人是否会考虑额外的窗口类型可能有点雄心勃勃,但我认为值得一问。

标签: jsongoogle-apps-scriptthree.js

解决方案


您不能在对 HtmlService 的调用中维护全局变量。当您触发在浏览器中运行的 HtmlService 实例时,启动它的服务器端代码将退出。

从那时起,控制就是客户端,在 HtmlService 代码中。如果您随后启动服务器端函数(从客户端使用 google.script.run),则会启动服务器端脚本的新实例,而不会存储前一个实例 - 这意味着任何全局变量都会重新初始化。

有许多技术可以在调用中保留值。

  • 最简单的当然是首先将其传递给 htmlservice,然后将其作为参数传递回服务器端 google.script.run。
  • 另一种是使用物业服务来保存您的值,当您返回时它们仍然存在,但最大条目大小为 9k
  • 如果您需要更多空间,那么缓存服务可以在单个条目中保存 100k,您可以以相同的方式使用它(尽管它有可能被清除掉——尽管这对我来说从未发生过)
  • 如果您需要更多空间,可以使用一些技术来压缩和/或将单个对象分散到多个缓存条目中 - 如此处所述http://ramblings.mcpher.com/Home/excelquirks/gassnips/squuezer。如果您需要更长时间地保留数据,同样的方法支持 Google Drive 或 Google 云存储

当然你不能传递像函数等不可字符串化的对象,但是你可以推迟它们的评估并允许初始化的服务器端脚本来评估它们,甚至在服务器、客户端或跨项目之间共享相同的代码。

这些文章中描述了一些技术 http://ramblings.mcpher.com/Home/excelquirks/gassnips/nonstringify http://ramblings.mcpher.com/Home/excelquirks/gassnips/htmltemplateresuse

但是,在您的具体示例中,您想要的全局数据似乎是从外部 api 调用中获取的。为什么不只是在任何情况下检索它的客户端呢?如果您需要在服务器端对其进行处理,则使用 google.script.run 将其传递给服务器。


推荐阅读