Javascript 功能未按预期执行。我希望页面切换到';设置';但这并不意味着';不会发生

Javascript 功能未按预期执行。我希望页面切换到';设置';但这并不意味着';不会发生,javascript,redirect,google-apps-script,Javascript,Redirect,Google Apps Script,我正在GAS HTML上创建一个非常基本的登录函数。在我的HTML中,我有一个表单,用于收集和存储带有指定变量(fn、ln、em、pw)的用户输入。然后,它将信息发送到工作表(其中包含验证凭证的公式),然后某个单元格('E2')将显示“已找到”或“未找到”。然后,如果if语句为false,它将在单元格('E1')中打印名称。此部分确实正确执行,但是两个函数,render('setup')和notFound()将不会执行(无论语句何时为true或false,如果语句为true或false,则两个函

我正在GAS HTML上创建一个非常基本的登录函数。在我的HTML中,我有一个表单,用于收集和存储带有指定变量(fn、ln、em、pw)的用户输入。然后,它将信息发送到工作表(其中包含验证凭证的公式),然后某个单元格('E2')将显示“已找到”或“未找到”。然后,如果
if
语句为false,它将在单元格('E1')中打印名称。此部分确实正确执行,但是两个函数,
render('setup')
notFound()
将不会执行(无论
语句何时为true或false,如果
语句为true或false,则两个函数都不起作用)

我知道
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>

提交
发送

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

仅从客户端调用服务器端函数是无法做到这一点的:用于检索客户端上不可用的数据,但不用于呈现不同的HTML文件

您可以改为执行以下操作:

  • 返回可在客户端使用的参数,而不是返回函数(如
    render
    notFound
功能符号(fn、ln、em、pw){
//代码的其余部分
如果(检查==“未找到”){
返回“notFound”;
}否则{
返回“设置”;
}
}
  • 您的客户端函数(我称之为
    callSignIn
    )可以将此返回参数传递给另一个名为
    redirect
    的函数,这要归功于(由于
    google.script.run.signIn(fn,ln,em,pw)
    本身总是需要此处理程序):
函数callSignIn(){
var fn=document.getElementById('first_name')。值;
//代码的其余部分
google.script.run.withSuccessHandler(刷新).signIn(fn,ln,em,pw);
}
  • 接下来,
    signIn
    返回的值作为函数
    refresh
    的参数传递,该函数刷新web应用程序,如果参数为
    setup
    ,则将
    setup
    作为查询参数(
    pageRedirect
    )传递,稍后可由
    事件参数使用(您可以从服务器端动态检索web app URL,而不是手动写入它-请参阅):
函数刷新(重定向页面){
如果(重定向页面==“设置”){
窗口打开(“https://script.google.com/macros/s/{您的web应用id}/exec?pageRedirect=“+redirectPage,”_top”);
}否则{
//如果“找不到”,你想做什么
}
}
  • 最后,回到服务器端,函数
    doGet
    窗口中的
    GET
    请求调用。打开
    。此函数可以通过
    e.parameter
    检查请求中是否有查询参数,这要感谢,并根据此参数呈现不同的页面:
函数doGet(e){
如果(!e.parameter.pageRedirect){
返回HtmlService.createHtmlOutFromFile(“索引”);
}否则{
返回HtmlService.CreateHtmlOutFromFile(e.parameter.pageRedirect)
}
}
参考:

评论不适用于长时间的讨论;本次对话已经结束。我还没有尝试过,但这似乎正是我的问题所在!我将研究它并尝试实施它。谢谢!太棒了!它在最小的调整下工作得非常完美。非常感谢您花时间解释它。这有点像我所想的ught,服务器端和客户端之间的问题。我感觉如此盲目,以至于我没有意识到当它需要字符串时会返回一个空值!@jrob11不客气。我很高兴我的回答对你有用。