如何为以编程方式创建的 Google 电子表格提供边栏?

How can I give my programmatically created Google Spreadsheets a Sidebar?

背景:

  1. 我有一个 脚本项目,使用 node-google-apps-script
  2. 我有一个 Rails 应用程序,它使用 脚本项目 通过 REST 执行 API[=52= 创建电子表格].它通过克隆模板电子表格来实现。
  3. 我的 Rails 应用偶尔也会使用 REST 执行 API
  4. 将数据推送到电子表格
  5. 脚本项目使用发布>部署为API可执行...私下发布,Rails App 使用 API 可执行 ID 与其通信。

以上都还算可以,开发也不是太麻烦。

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

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

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

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

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

我可以给模板电子表格一个绑定脚本。显然,那将被复制。 绑定脚本 不能与node-google-apps-script 一起使用,所以我将无法使用复制和粘贴更新。更新脚本需要手动更新每个现有的电子表格!然而,我可以将侧边栏制作成一个骨架,从 Script Project.

中提取其实际内容

有没有更好的方法?

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

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

库函数:

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 可执行文件,然后将脚本的共享设置为 public-仅查看,但必须有 link。这是唯一可以让多个用户使用的方法。

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

这至少应该让您知道从哪里开始测试。