为什么使用 google.script.run 调用的服务器端函数会被调用两次,间隔 10 秒?

问题描述 投票:0回答:1

我有一个绑定到一张纸上的脚本。需要

  1. 提示用户输入一些数据
  2. 进行一些处理,可能会有附加提示。

客户端 HTML 表单似乎是 1 的最佳选择,因为用户需要从动态生成的列表中进行选择。 2 中的提示只需要一个简单的响应,因此使用 ui.prompt() 似乎是正确的方法。我希望 1 中的对话框在提交后立即关闭,并且服务器端处理异步完成。

除非在 2 中调用此 ui.prompt() (或任何 ui 方法),否则一切正常。在这种情况下,如果此对话框在 10 秒内没有关闭,则服务器端函数 processForm() 会再次被调用,准确地说第一次调用后 10 秒。 execution log

我将代码简化为简单的代码以隔离问题。表单现在只是一个按钮,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>
google-sheets google-apps-script dialog client-server
1个回答
0
投票

一些用户,其中大多数是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>

© www.soinside.com 2019 - 2024. All rights reserved.