服务器错误,google.script.run 使用共享库时失败

Server error, google.script.run fails when using a shared library

我有两个 Google Apps 脚本项目,都是电子表格类型。

让我们调用一个 Server 和另一个 Client

我想从 Server 公开一些函数,这样我就可以从 Client 调用它们。

图书馆似乎很适合这个。

不幸的是,当我使用资源 --> 库...菜单选项将 Server 库添加到 Client 时,东西被破坏了。

请注意,即使 Server 库已添加到 Client,我实际上从未使用任何 Server库函数。 (其实ServerCode.gs完全是一片空白。)

服务器Code.gs

//nothing, totally blank, these are test projects created find out what is wrong

客户端 Code.gs

//This is our entry point
//It instantiates the Sidebar from Sidebar.html
function test() 
{
  SpreadsheetApp.getUi().showSidebar(HtmlService.createHtmlOutputFromFile('Sidebar')
  .setSandboxMode(HtmlService.SandboxMode.IFRAME));
}


function testReturn()
{
  Logger.log("doTest() called");
  return 1;
}

客户端 Sidebar.html

<script>
function yay(d)
{
  alert('yay: ' + d);
}

function boo(d)
{
  alert('boo: ' + d);
}

google.script.run.withFailureHandler(boo).withSuccessHandler(yay).testReturn();
</script>

应该发生什么:

  1. 我们调用Client.test()。

    这会打开来自 Sidebar.html

    的边栏

    边栏 运行s:

    google.script.run.withFailureHandler(boo).withSuccessHandler(yay).testReturn();
    
  2. 这应该从 Client Code.gs

    调用 testReturn()

    testReturn() 完成(或未完成)时...

  3. 应调用 yay(d)boo(d)

很简单...

所以当我们有 NO 库附加时,yay(d) 被调用! (在这种情况下使用 d = 1

但是当我们 DO 附加了一个库时,boo(d) 被调用

d = ScriptError: We're sorry, a server error occurred. Please wait a bit and try again.

此外,我相信 testReturn() 永远不会 运行 因为它不会出现在日志中。

我做错了什么?这是 Google 方面的错误吗?

我做了测试项目public:

总而言之,我不明白为什么简单地添加共享库会破坏 google.script.run... 功能。特别是因为图书馆是空白的。

tl;dr 您的“库”是包含电子表格的脚本。为你的库使用一个独立的脚本,你会没事的。


我使用您的示例代码创建了一个脚本和库,并且运行良好。我抓取了你共享文件的副本,它们都是电子表格,并重现了这个错误:

We're sorry, a server error occurred. Please wait a bit and try again.

我尝试了几个著名的 public 库,SheetConverter and BetterLog。如果我从项目中删除了你的库,一切都很好。

观察:问题是存在a图书馆,这是你的图书馆的存在。

与我的手卷副本和两个 public 库相比,您的库有什么特别之处?你的是包含电子表格的。其他三个是独立的。

结论:不要那样做。对于库,请使用独立脚本。

我在当前的任何文档中都没有发现这一点。碰巧的是,我所有的库都是独立脚本,所以我以前从未 运行 遇到过这个限制,也不能说它是新的东西还是旧的文档或示例表达了独立的要求。


关于您的其他疑问/问题...

  • And when testReturn() finishes (or doesn't)...

    WRT “或不”部分...当服务器函数 throw 出现异常时调用 failureHandler。您观察到的错误消息就是这样的一个例外。如果您有意要调用 failureHandler,您的服务器代码应该 throw.

  • Also, I believe testReturn() is never run because it does not show up in the logs.

    触发脚本并不总是可以访问编辑器的日志查看器,因此您应该考虑使用 BetterLog 库将日志写入电子表格。它甚至适用于没有附加调试器的触发器函数和 Web 应用程序。 (只是说,因为缺少日志不能可靠地暗示从客户端代码调用的函数没有 运行。)

5 年后我来到这里时遇到了类似的问题 - google.script.run 失败并出现服务器错误 500。我的设置类似 - 电子表格绑定 GAS 和对同一项目中库的引用。与您的情况不同,我的图书馆是独立的。 另外,我项目中依赖库的代码是独立于google.script.run相关代码的。如果我从项目中剔除 lib 及其依赖代码,那么 google.script.run 位可以正常工作。

解决方案 - 至少在我的情况下......事实证明,只有当库指向其头部而不是(任何)版本化部署时才会发生服务器错误([https://developers.google .com/apps-script/concepts/deployments][1])。 即使库头在代码方面与其最新版本完全匹配,这也适用。所以它甚至不是 lib 代码,而是部署。可能无关紧要,但以防万一 - 该库引用了 BigQuery API 服务。我没有进一步试验这个。

希望这对登陆这里遇到类似问题的人有所帮助。

我将进行以下两项更改。

  1. 确保您的图书馆与拥有 Google 帐户的任何人共享。
  2. 在您使用库的代码中,使用具有非零编号的版本。默认情况下,库版本设置为 0。将其更改为某个非零数字(希望是您最近部署的库)。如果您没有看到您的库的任何版本号,那么您首先需要部署它。