【问题标题】:How can I give my programmatically created Google Spreadsheets a Sidebar?如何为我以编程方式创建的 Google 电子表格提供边栏?
【发布时间】:2016-05-17 21:08:53
【问题描述】:

背景:

  1. 我有一个 脚本项目,使用 node-google-apps-script 进行工具化
  2. 我有一个 Rails 应用程序,它使用 Script Project 通过 REST Execution API 创建电子表格。它通过克隆模板电子表格来做到这一点。
  3. 我的 Rails 应用偶尔也会使用 REST 执行 API 将数据推送到电子表格
  4. Script Project 使用 Publish>Deploy as API Executable... 私下发布,Rails App 使用 API Executable ID与它交谈。

以上都运行的还算不错,开发也不算繁重。

现在我希望生成的电子表格有一个侧边栏。到目前为止,我发现的替代方案似乎都有问题:

备选方案 1:发布私有插件

我知道我可以让我的客户让我成为他们 google 应用程序域的管理员,然后我可以将 脚本项目 发布为受域限制的插件。这种替代方案似乎对开发和使用都很繁重:

  • 加载项最多需要一个小时才能发布。发布 Script Project 版本现在是两个无法自动化的手动例程
  • 据我所知,我无法以编程方式将插件添加到电子表格中。使用前必须将其安装在每个电子表格中。

备选方案 2:为模板电子表格提供绑定脚本

我可以给模板电子表格一个绑定脚本。显然,这将被复制。 绑定脚本无法使用node-google-apps-script 处理,因此我将无法使用复制和粘贴更新。更新脚本需要手动更新每个现有的电子表格!不过,我可以让侧边栏成为一个框架,从 Script Project 中提取其实际内容。

有没有更好的方法?

【问题讨论】:

  • option2 的变体加上您的库是可能的。等有时间我会在这里发布更多细节。

标签: google-apps-script google-apps


【解决方案1】:

基本上,您可以做的是将编程的所有侧边栏创建部分与您创建的库联系起来。在您使用的模板化电子表格中,您只需执行以下操作:

  1. 使用库脚本的项目密钥将您的库添加到容器绑定脚本中。
  2. 添加一个简单的 onOpen 函数来创建一个菜单,然后调用库创建侧边栏函数。
  3. 由于侧边栏可能调用的所有服务器端函数都将包含在库中,因此您需要添加一个函数处理程序,以便在使用 @987654322 时调用库中的正确函数以传递给侧边栏@例如:

库函数:

function getSomeNum() {
  return 3;
}

function doSomething(e) {
  return e.num * 2;
}

var runFunction = {
  getSomeNum : getSomeNum,
  doSomething : doSomething
};

function runHandler(functionName, parameters) {
  return runFunction[functionName](parameters);
}

容器绑定处理程序:

function runHandler(functionName, parameters) {
  return MyLibraryIdentifier.runHandler(functionName, parameters);
}

从侧边栏调用 google.script.run 示例:

function onLoad() {
  google.script.run
    .withSuccessHandler(processNum)
    .runHandler("getSomeNum");
}

function processNum(num) {
  var event = {
    num : num
  };

  google.script.run
    .withSuccessHandler( function(retNum) { alert(retNum); } )
    .runHandler("doSomething", event);
}

请记住,任何需要使用此侧边栏的用户都必须至少具有对库的查看权限。我最终做的是部署为任何人的 API 可执行文件,然后将脚本的共享设置为仅公共视图,但必须具有链接。它似乎是唯一能将它提供给多个用户的方法。

另一个缺点是更新库代码时,容器绑定脚本不会更新,除非您更改它们使用的库版本。这意味着用户必须积极寻找更新的库版本。更新 API 可执行文件时,菜单给您的印象是您可以更新当前版本,但我没有任何运气能够真正让它反映更改(也许我只是没有足够的耐心)。

这至少应该让您了解从哪里开始测试。

【讨论】:

  • 这看起来很棒,非常感谢。我将在今天晚些时候尝试并提供反馈。你必须为任何人部署 API 可执行文件,这很糟糕,但我有一种感觉,我最终不得不在某个时候这样做。我将通过将库 id 写入电子表格来处理它,并让我的 rails 应用程序能够将版本推送到所有电子表格。我也这样做是为了给电子表格一个身份验证令牌,因此给定的电子表格只能影响与其相关的 rails 应用程序中的数据。
  • 终于有机会做这件事了。它按描述工作,但有几个问题:调试有点困难,因为您无法访问绑定脚本处理程序的日志(手动运行它们除外)。我尝试使用BetterLog 让生活更轻松,但 GAPPS 不允许我在 onOpen/onInstall 中使用 BetterLog,即使是间接通过我的库也是如此。在处理程序中很好。其次,它非常慢 -- 运行处理程序最多需要 4 秒。
  • runFunction 结构体是不必要的;可以使用this[functionName]
  • 虽然最好明确定义客户端处理程序可以访问的功能。
  • 库在 GAS 中的运行速度通常较慢,对于我的特殊用途,速度并不是决定性因素。虽然我并没有真正意识到有那么大的区别。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 2020-04-19
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多