google 网络应用程序 - 使用 html 表单提交更新事件参数?

google web app - Update event parameter with html form submit?

我有一个这样的网络应用程序:

文件Code.gs

function doGet(e) 
{
    var id = e.parameter.id;
    if (id == null || id == "")
    {
        return HtmlService.createHtmlOutputFromFile("InputId");
    }
    else
    {
        return HtmlService.createHtmlOutput("Your id is: "+id);
    }
}

文件InputId.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    <form>
      <label for="idEmail">Email:</label>
      <input type="text" id="idEmail" name="id"><br><br>
      <input type="submit" value="Ok">
    </form>
  </body>
</html>

所以网络应用程序是这样工作的:

当用户转到:https://script.google.com/macros/s/SomeYadaYada/dev

页面显示表单 InputId.html 要求用户的 Id(a.k.a 电子邮件),用户应该输入 Id(例如 YadaYada@gmail.com)然后单击按钮确定。

预计: Url 栏重定向到 https://script.google.com/macros/s/SomeYadaYada/dev?id=YadaYada@gmail.com,以便 Web 应用程序显示文本:“您的 ID 是 YadaYada@gmail.com”。

结果: Url 栏重定向到 https://SomeYadaYada-script.googleusercontent.com/userCodeAppPanel?id=YadaYada@gmail.com,Web 应用程序当然不显示任何内容。

我整个上午都在谷歌上搜索解决方案,但我只找到了 the solution“event.preventDefault();”这对我不起作用(它只会阻止页面重新加载,而我需要页面更新事件参数并重新加载)。

如何使用 html 表单提交更新事件参数?还是有更好的方法来解决这个问题?我希望我能找到将网络应用程序嵌入到 Google 站点时也能正常工作的解决方案。

实现一个看起来像按钮的 link

实施示例:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
  </head>
  <body>
    <form>
      <br>
      <label for="idEmail">Email:</label>
      <input type="text" id="idEmail" name="id"><br><br>
      <a class="btn btn-primary " id="button">Ok</a>
    </form>     
  </body>
  <script>      
    var button = document.getElementById("button")
    button.addEventListener("click", redirect) 
    function redirect(){
      var baseUrl = "https://script.google.com/a/SomeYadaYada/exec"
      var id = document.getElementById("idEmail").value
      button.href = baseUrl + "?id=" + id
      button.click()
    }
    </script>
</html>

我明白了,我只需要稍微重新设计一下我的应用程序。现在,我不再使用表单同页提交到 post 事件参数,而是完全删除事件参数并使用 Google's proposed technique

文件Code.gs

function doGet(e) 
{
  return HtmlService.createHtmlOutputFromFile('Index');
}

function processForm(formObject) 
{
    var id = formObject.id;

    if (id == null || id == "")
    {
        return "Please enter email.";
    }

    return "Your id is: "+id;
}

文件Index.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script>
      // Prevent forms from submitting.
      function preventFormSubmit() {
        var forms = document.querySelectorAll('form');
        for (var i = 0; i < forms.length; i++) {
          forms[i].addEventListener('submit', function(event) {
            event.preventDefault();
          });
        }
      }
      window.addEventListener('load', preventFormSubmit);

      function handleFormSubmit(formObject) {
        google.script.run.withSuccessHandler(getFormMsg).processForm(formObject);
      }
      function getFormMsg(strMsg) {
        var div = document.getElementById('output');
        div.innerHTML = "<p>"+strMsg+"</p>";
      }
    </script>
  </head>
  <body>
    <form id="myForm" onsubmit="handleFormSubmit(this)">
      <input name="id" type="text" />
      <input type="submit" value="Submit" />
    </form>
    <div id="output"></div>
 </body>
</html>

我喜欢这个解决方案,因为当我将 Web 应用程序嵌入 Google 站点时它看起来会起作用,让我以后不再头疼。