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>
答案 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();
如果没有出现任何消息,则问题不在此处,而在其他地方。其他一些事情是阻止你的脚本甚至开始。