Html google.script.run并非每次调用时都在运行。有时函数运行,有时它什么也不做

Html google.script.run并非每次调用时都在运行。有时函数运行,有时它什么也不做,html,google-apps-script,web-applications,Html,Google Apps Script,Web Applications,在Google应用程序脚本中,当使用客户端.HTML文件时,可以使用Google.script.run.(函数名)调用服务器端脚本 您可以在此处查看相关文档: 现在,这个脚本在其生命周期的前6个月左右一直在正常工作。我没有接触该程序,也没有收到通知,也没有找到任何新弃用的代码 然而,在过去的几个月里,我的用户一直报告说,当他们完成与HTML文档的交互时,关闭它时什么也不会发生,他们必须重复整个过程3次,有时甚至4次,然后才能完成。, 这意味着当用户关闭客户端HTML窗口时,应该调用服务器端函数来

在Google应用程序脚本中,当使用客户端.HTML文件时,可以使用Google.script.run.(函数名)调用服务器端脚本

您可以在此处查看相关文档:

现在,这个脚本在其生命周期的前6个月左右一直在正常工作。我没有接触该程序,也没有收到通知,也没有找到任何新弃用的代码

然而,在过去的几个月里,我的用户一直报告说,当他们完成与HTML文档的交互时,关闭它时什么也不会发生,他们必须重复整个过程3次,有时甚至4次,然后才能完成。, 这意味着当用户关闭客户端HTML窗口时,应该调用服务器端函数来处理剩余的任务,但在某些情况下不是这样。这个问题完全是随机的,似乎不是由任何特定的原因造成的

我自己也采取了一些措施试图解决这个问题。我已经将整个代码包装在try-catch块中,包括.HTML和.GS文件。这意味着,如果任何脚本中出现任何错误,我将立即得到通知。然而,尽管如此,我还没有收到任何关于它失败的电子邮件,即使我亲眼看到它失败。我已经在这个函数之前和之后添加了日志命令,以查看它是停止工作还是继续工作。在任何情况下,不管函数调用是否成功,日志命令都会执行

对我来说,这只意味着出于某种原因,函数google.script.run工作不正常,无法运行相关函数,但没有返回错误消息或停止脚本

我完全不知所措,因为我没有错误信息,没有可重复的步骤,也没有这是一个问题的历史,而随着时间的推移,突然变得越来越糟糕。我已经检查了谷歌的问题跟踪没有结果。如果其他任何人正在使用此功能并且遇到问题,我希望您在这里分享您的经验。如果你有解决办法,请尽快告诉我。如果我不能解决这个问题,我将不得不完全使用一个新的平台

编辑10/2: 在深入研究这个问题之后,我发现了这个项目上所有执行情况的列表。我可以看到执行了哪些函数,何时执行,以及执行所用的时间。我可以看到,当打开HTML服务的函数运行时,应该运行的下一个函数并不总是出现在列表中。如果没有,我可以看到用户重复他们的步骤,直到它运行。这支持了我的理论,即调用我的脚本后,函数在应该运行的时候没有运行;dr:受影响的计算机运行速度太慢,以至于google.script.host.close会在调用google.script.run.functionName()之前运行,并且会将信息从客户端传递到服务器,导致函数永远不会运行,但也不会返回错误。添加
Utilities.sleep(1000)
解决了这个问题

我在这里回答的情况是,有人在未来偶然发现这个线索,因为他们有类似的问题。 我能够通过在两行代码之间添加两行代码来解决这个问题
google.script.run
google.script.host.close
。 我添加了Google的
实用程序.sleep(1000)
,强制计算机在执行函数和关闭HTML窗口之间等待一秒钟。我还添加了一个HTML警报,显示函数已被调用,并且没有出现运行时错误

我不知道为什么这似乎解决了这个问题,但我有一个理论。 我有大约20台计算机运行这个电子表格。只有大约6个人有这个问题,直到最近才引起我的注意。事实证明,出现问题的6台计算机是这组计算机中速度最慢的。 我的理论是,计算机运行速度太慢,互联网带宽波动太大,以至于计算机根本没有时间调用google.script.run并传递客户端HTML窗口中的信息,因此在运行google.script.host.close时,它会被关闭并切断。这意味着函数将不存在于执行记录或历史记录中,也不会出现任何运行时错误。在我的情况下,所有这些都是真实的。这也解释了为什么我自己的设备在测试环境中从来没有出现过问题,因为它没有受到其他计算机的任何减速的影响

通过添加
Utilities.sleep(1000)
和UI警报,这将强制javascript在用户与UI警报交互(这只是一个带有OK按钮的确认窗口)并等待整整一秒钟之前,不继续执行google.script.host.close。这就牺牲了一点用户友好性来获得更具功能性的脚本。因为我已经实现了这个“修复”,所以我的用户都没有报告任何问题,我的所有执行历史看起来都很好

希望这能帮助未来的路人

在您发布的函数片段中:

下面是使用
google.script.run
的脚本的基本副本:

这里的问题是-在调用
google.script.host.close()
之前,甚至不能保证启动对服务器端函数
processForm
的调用:

客户端对服务器端函数的调用是异步的:在浏览器请求服务器运行函数
doSomething()
之后,浏览器立即继续执行下一行代码,而不等待响应。这意味着服务器函数调用可能不会按预期的顺序执行。如果你做两个
function onFailure(error) {
  MailApp.sendEmail("sparkycbass@gmail.com", "Order book eror", "ERROR: " + error.message);
  google.script.host.close();
}
function handleFormSubmit(formObject) { 
  google.script.run.withFailureHandler(onFailure).processForm(formObject)
  google.script.host.close();
}
function onFailure(error) { // server function threw an unhandled exception
  google.script.run.sendMeAnEmail("Order book error", "ERROR: " + error.message);
  console.log(error);
  document.getElementById("some element id").textContent = "There was an error processing that form. Perhaps try again?"
}
function onSuccess(serverFunctionOutput, userObj) {
  // do stuff with `serverFunctionOutput` and `userObj`
  // ...
  google.script.host.close();
}
function handleFormSubmit(formObject) {
  google.script.run
    .withFailureHandler(onFailure)
    .withSuccessHandler(onSuccess)
    .processForm(formObject);
}
function processForm(formData) {
  console.log({message: "Processing form data", input: formData});
  // ...
}
function sendMeAnEmail(subject, message) {
  console.log({message: "There was a boo-boo", email: {message: message, subject: subject}});
  MailApp.sendEmail("some email", subject, message);
}