服务器错误,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>
应该发生什么:
我们调用Client.test()。
这会打开来自 Sidebar.html
的边栏
边栏 运行s:
google.script.run.withFailureHandler(boo).withSuccessHandler(yay).testReturn();
这应该从 Client Code.gs
调用 testReturn()
当 testReturn()
完成(或未完成)时...
应调用 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 服务。我没有进一步试验这个。
希望这对登陆这里遇到类似问题的人有所帮助。
我将进行以下两项更改。
- 确保您的图书馆与拥有 Google 帐户的任何人共享。
- 在您使用库的代码中,使用具有非零编号的版本。默认情况下,库版本设置为 0。将其更改为某个非零数字(希望是您最近部署的库)。如果您没有看到您的库的任何版本号,那么您首先需要部署它。
我有两个 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>
应该发生什么:
我们调用Client.test()。
这会打开来自 Sidebar.html
的边栏边栏 运行s:
google.script.run.withFailureHandler(boo).withSuccessHandler(yay).testReturn();
这应该从 Client Code.gs
调用testReturn()
当
testReturn()
完成(或未完成)时...应调用
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 服务。我没有进一步试验这个。
希望这对登陆这里遇到类似问题的人有所帮助。
我将进行以下两项更改。
- 确保您的图书馆与拥有 Google 帐户的任何人共享。
- 在您使用库的代码中,使用具有非零编号的版本。默认情况下,库版本设置为 0。将其更改为某个非零数字(希望是您最近部署的库)。如果您没有看到您的库的任何版本号,那么您首先需要部署它。