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 条消息,则问题不在此处,而在其他地方。其他一些事情甚至阻止您的脚本启动。
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 条消息,则问题不在此处,而在其他地方。其他一些事情甚至阻止您的脚本启动。