首页 > 解决方案 > 功能未按预期执行。我希望页面切换到“设置”,但这不会发生

问题描述

我正在 GAS HTML 上创建一个非常基本的登录功能。在我的 HTML 中,我有一个表单,它收集和存储带有分配变量(fn、ln、em、pw)的用户输入。然后它将信息发送到工作表(具有验证凭据的公式),然后某个单元格('E2')将显示“找到”或“未找到”。if如果语句为假,它将在单元格('E1')中打印名称。这部分确实执行正确,但是 2 个函数,render('setup')并且notFound()不会执行(无论if语句是真还是假,都不起作用。

我知道该render('setup')函数doGet在其他函数中调用时运行良好。

function signIn(fn,ln,em,pw) {

  var url = 'www.somelink.com'
  var ss = SpreadsheetApp.openByUrl(url);
  var login = ss.getSheetByName('login');
  var fname = login.getRange('F1');
  var lname = login.getRange('G1');
  var email = login.getRange('H1');
  var pword = login.getRange('I1');

  fname.setValue(fn);
  lname.setValue(ln);
  email.setValue(em);
  pword.setValue(pw);

  var check = login.getRange('E2').getDisplayValue();
  var name = login.getRange('F2').getDisplayValue();

  if (check === "Not Found"){  
  return notFound(); // THIS DOESN'T EXECUTE
  } else {
  login.getRange('E1').setValue(name);
  return render('setup'); // AND THIS DOESN'T EXECUTE
  }
}

编辑:调用signIn函数的 HTML。

  <div class="button" align="center">
        <button id="submit" class="btn waves-effect waves-light" onclick="var fn = document.getElementById('first_name').value;
          var ln = document.getElementById('last_name').value;
          var em = document.getElementById('email').value;
          var pw = document.getElementById('password').value;
          google.script.run.signIn(fn,ln,em,pw)">Submit
    <i class="material-icons right">send</i>
    </button>

标签: javascriptredirectgoogle-apps-script

解决方案


如果我理解正确,您希望您的网络应用程序在提交值后将用户重定向到另一个 HTML 页面(如果满足某些条件)。

您不能仅通过从客户端调用服务器端函数来做到这一点:google.script.run用于检索客户端上不可用的数据,但不用于呈现不同的 HTML 文件。

你可以做的是以下内容:

  • 不是返回一个函数(如renderor notFound),而是返回一个可以在客户端使用的参数。例如,您可以这样做:
function signIn(fn,ln,em,pw) {
  // Rest of your code
  if (check === "Not Found") {  
    return "notFound";
  } else {
    return "setup";
  }
}
  • 多亏了withSuccessHandler(function) ,您的客户端函数(我称之为callSignIn)然后可以将此返回的参数传递给另一个名为的函数(此处理程序是必要的,因为它本身将始终返回):redirectgoogle.script.run.signIn(fn,ln,em,pw)void
function callSignIn() {
  var fn = document.getElementById('first_name').value;
  // Rest of your code
  google.script.run.withSuccessHandler(refresh).signIn(fn,ln,em,pw);
}
  • 接下来,返回的值signIn作为函数的参数传递,如果参数是,则使用window.openrefresh刷新 Web 应用程序,同时作为查询参数 ( )传递,稍后可以由(您可以从服务器端动态检索 Web 应用程序 URL,而不是手动编写它 - 请参阅此答案):setupsetuppageRedirectevent parameter
function refresh(redirectPage) {
  if (redirectPage === "setup") {
    window.open("https://script.google.com/macros/s/{your-web-app-id}/exec?pageRedirect=" + redirectPage, "_top");
  } else {
    // Whatever you want to do if "notFound"
  }
}
  • 最后,回到服务器端,该函数doGet被来自的GET请求调用window.opene.parameter这个函数可以通过事件对象检查请求中是否有查询参数,并根据这个参数渲染不同的页面:
function doGet(e) {
  if (!e.parameter.pageRedirect) {
    return HtmlService.createHtmlOutputFromFile("index");
  } else {
    return HtmlService.createHtmlOutputFromFile(e.parameter.pageRedirect)
  }
}

参考:


推荐阅读