我有一个绑定到一张纸上的脚本。需要
客户端 HTML 表单似乎是 1 的最佳选择,因为用户需要从动态生成的列表中进行选择。 2 中的提示只需要一个简单的响应,因此使用 ui.prompt() 似乎是正确的方法。我希望 1 中的对话框在提交后立即关闭,并且服务器端处理异步完成。
除非在 2 中调用此 ui.prompt() (或任何 ui 方法),否则一切正常。在这种情况下,如果此对话框在 10 秒内没有关闭,则服务器端函数 processForm() 会再次被调用,准确地说第一次调用后 10 秒。
我将代码简化为简单的代码以隔离问题。表单现在只是一个按钮,processForm() 中没有任何处理,而是 ui.alert() 而不是 ui.prompt()。
如果10秒内没有响应,客户端似乎会进行第二次调用,但我没有找到任何这方面的文档。我确认handleSubmit()只被调用一次。
服务器端代码:
var ui;
function onOpen(e) {
ui = SpreadsheetApp.getUi();
ui.createAddonMenu()
.addItem('test', 'test')
.addToUi();
}
function test() {
ui = SpreadsheetApp.getUi();
var html = HtmlService.createHtmlOutputFromFile('Input');
ui.showModalDialog(html, 'Input');
}
// Function to process the form data. Called from HTML script
function processForm() {
ui = SpreadsheetApp.getUi();
ui.alert('hi');
return;
}
客户端代码(Input.html)
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<form id="myForm" onsubmit="handleSubmit()">
<input type="submit" id="submitButton" value="Submit">
</form>
<script>
function handleSubmit() {
console.log("handleSubmit invoked at:", new Date().toISOString());
google.script.run.processForm(); // process the server-side code asynchronously, so this dialog can close right away
google.script.host.close(); // Close the dialog
}
</script>
</body>
</html>
一些用户,其中大多数是Windows用户,有双击按钮的坏习惯,可能是因为他们应该双击Windows桌面上的图标来打开文件/应用程序。
禁用该按钮,防止双击导致该按钮两次登顶。下面是一个简单的 HTML/JavaScript 示例:
function handleSubmit(){
event.preventDefault();
event.target.querySelector('input[type=submit]').disabled = true;
console.log(event.target.id)
}
<form id="myForm" onSubmit="handleSubmit()">
<input type="submit">
</form>