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

时间:2015-06-25 09:52:43

标签: javascript html google-apps-script google-sheets client-server

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>

2 个答案:

答案 0 :(得分:1)

这似乎与计时有关 - 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员工会说出更好的解释,那就太好了。

答案 1 :(得分:1)

我正常使用它,它工作正常。

但我在页面加载之前从未尝试过。由于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();

如果没有出现任何消​​息,则问题不在此处,而在其他地方。其他一些事情是阻止你的脚本甚至开始。