google.script.run.myFunction() 不从客户端 HTML 脚本调用服务器 myFunction()

google.script.run.myFunction() doesn't call server myFunction() from client HTML script

According to the documentation,从客户端 HTML 脚本调用 Google Apps 脚本函数应该和 google.script.run.myFunction() 一样简单。但是它似乎对我不起作用:

我的代码

function onOpen() {
  SpreadsheetApp.getUi()
      .createMenu('Dialog')
      .addItem('Open', 'openDialog')
      .addToUi();
}

function openDialog() {
  var html = HtmlService.createHtmlOutputFromFile('Index')
      .setSandboxMode(HtmlService.SandboxMode.IFRAME);
  SpreadsheetApp.getUi()
      .showModalDialog(html, 'My Dialog');
}

function doSomething() {
  var sheet = SpreadsheetApp.getActive().getActiveSheet();
  sheet.getRange(sheet.getLastRow()+1, 1).setValue("Hello :)");
}

请注意,从 IDE 调用 doSomething() 运行顺利。但是不是来自 HTML 脚本:

我的HTML

<script>
google.script.run.doSomething();
</script>

这似乎完全与时间有关 - google.script.run 可能在客户端-服务器连接准备就绪之前被调用 *。显示用户界面的通常目的是与用户交互——因为人比机器慢得多,所以你不会遇到这个问题。

即使是显示 toast 的短暂延迟也足以使其正常工作。

function doSomething() {
  SpreadsheetApp.getActive().toast("hello")
  var sheet = SpreadsheetApp.getActiveSheet();
  sheet.appendRow(["Hello :)"])
  return true;
}

免费奖金! 提前思考您将 运行 遇到的下一个问题,注意 return 语句。服务器函数必须有某种 return 才能引起对 google.script.run.onSuccess() 处理程序的回调。


*编辑 - 这个解释有些不对,因为 toast 调用是在服务器上进行的。如果 Google 员工能站出来提供更好的解释,那就太好了。

我正常使用,效果不错。

但在页面加载之前我从未尝试过。由于 Google 有很多安全障碍,例如用自己的自定义主体替换 html body,我认为值得尝试在页面加载的处理程序中调用它。

尝试将警报放入处理程序(见下文)以查看它是否真的 运行。 html 代码其他部分的任何小错误通常会使整个脚本根本不 运行。

注意事项:如果您的服务器端脚本中有 global variables,这些 将不会持续存在 !!!每次您使用 google.script.run 时它们都会重置。因此,请确保 doSomething() 拥有 所需的一切

如果您希望在 doSomething() 之后看到结果,请考虑将处理程序添加到 google.script.run。您的服务器端脚本将无法更改用户界面,如果它是模态的,也无法打开新界面。 (从未尝试过非模态...)

google.script.run
    .withSuccessHandler(function(data,element){window.alert("executed");})
    .withFailureHandler(function(msg,element){window.alert("failed"); })
    .doSomething();

如果出现 none 条消息,则问题不在此处,而在其他地方。其他一些事情甚至阻止您的脚本启动。