【问题标题】:Server error, google.script.run fails when using a shared library服务器错误,使用共享库时 google.script.run 失败
【发布时间】:2015-07-11 00:50:50
【问题描述】:

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

让我们调用一个服务器和另一个客户端

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

图书馆似乎非常适合这一点。

不幸的是,当我使用 Resources --> Libraries... 菜单选项将 Server 库添加到 Client 时,东西中断了。

注意,即使 Server 库被添加到 Client,我实际上从未使用任何 Server 库函数。 (事实上​​ Server Code.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 中打开一个侧边栏

    边栏运行:

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

    testReturn() 完成(或没有完成)...

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

很简单……

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

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

d = ScriptError:很抱歉,发生服务器错误。请稍等,然后重试。

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

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

我公开了测试项目:

  • Server服务器键,可轻松将其添加为库:Mb7vYHsQuTR9f4-cMPhFPYBfykRDizSBp

  • Client

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

【问题讨论】:

    标签: google-apps-script google-sheets shared-libraries libraries


    【解决方案1】:

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


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

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

    我尝试了几个著名的公共图书馆,SheetConverterBetterLog。如果我从项目中删除了你的库,一切都很好。

    观察:问题不是存在一个,而是存在 您的图书馆

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

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

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


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

    • testReturn() 完成(或没有)...

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

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

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

    【讨论】:

    • 有趣...我从没想过独立库与项目绑定库。所以要实现我想要的功能,我应该在独立库中编写服务器代码,然后将它包含在服务器和客户端项目中?谢谢。
    • 这是共享通用代码的有效策略。关于性能有一些注意事项,因为库的加载和清理需要时间,但如果您没有注意到,IMO 的便利性和改进的可维护性是值得的。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      我会做以下两个改变。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-12
        • 1970-01-01
        • 2019-10-09
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 2019-08-31
        相关资源
        最近更新 更多