You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Google Apps Script的登录表单开发问题求助

Google Apps Script 登录表单问题排查

我正在用Google Apps Script开发登录表单,需求是仅授权用户可访问Web应用,验证通过后跳转至操作页面,但当前代码无法正常工作,请求排查解决。


原.gs代码

const url = "https://script.google.com/macros/s/AKfycbyGvCiggfwsHQfcqs5HBFZj2LS0idotzLBGMQUzAoSIn3ucZuPNLR7t4sYigfDyIOY5/exec";
function doGet(e){
  var user = e.parameter.name;
  var password = e.parameter.pass;
  var users = ["admin","123","user","456","guest","789"];
  var message ='';
  //---------------------------------------------------------------------------
  for (var i =0;i<users.length;i++){
    if(users[i][0]== user && users[i][1]== password){
      message='';
      const show = HtmlService.createTemplateFromFile("show");
      return show.evaluate();
      
    }else{
      message='fail to login try again!'
      var template = HtmlService.createTemplateFromFile("login");
      return template.evaluate();
    }
  }
      
}

原login.html代码

<!doctype html>
<html lang="en">

<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">

  <title>EPSP-TGGT</title>
  
</head>

<body>

  <div class="container">
    <div class="col-md-6 mx-auto">
      <div class="card">
        <div class="card-body">
          <div class="card-header bg-primary mb-2 text-center text-white">
            Admin
          </div>
          <form id="myForm"> 
            <h4> "<?!= message ?>" </h4>           
            <div class="input-group flex-nowrap  mb-2">
              <span class="input-group-text" id="addon-wrapping">@</span>
              <input type="text" class="form-control" id="name" placeholder="Username" required>
            </div>
            <div class="input-group flex-nowrap mb-2">
              <span class="input-group-text" id="addon-wrappingg">@</span>
              <input type="password" class="form-control" id="pass" placeholder="Password" required>
            </div>
            <button type="submit" onclick="sample()" class="btn btn-primary w-100">Login</button>            
          </form>
        </div>
      </div>
    </div>
  </div>
  <!-- JS-Code To get user & pass and put them as Paramaters in the script-url -->
  <script>
    function sample() {
      const url = "<?!= url ?>";
          const [name, pass] = ["name", "pass"].map((e) => document.getElementById(e).value);
          window.open(`${url}?name=${name}&pass=${pass}`, "_top");
    }
  </script>

  <!-- Option 2: Separate Popper and Bootstrap JS -->

  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>


</body>

</html>

问题分析与修正方案

1. 用户数据结构错误

原代码中users是一维数组,每个元素是字符串,users[i][0]取的是字符串的第一个字符(比如"admin"[0]是"a"),无法正确匹配用户名和密码。需改成二维数组,每个子数组存储一组用户名和密码:

var users = [["admin","123"], ["user","456"], ["guest","789"]];

2. 循环逻辑错误

原循环中第一次不匹配就直接返回登录页,不会检查后续用户。应遍历完所有用户后,确认无匹配才返回错误:

// 替换原循环逻辑
let isAuthenticated = false;
for (var i = 0; i < users.length; i++) {
  if (users[i][0] === user && users[i][1] === password) {
    isAuthenticated = true;
    break;
  }
}

if (isAuthenticated) {
  const show = HtmlService.createTemplateFromFile("show");
  return show.evaluate();
} else {
  message = '登录失败,请重试!';
  var template = HtmlService.createTemplateFromFile("login");
  template.message = message; // 传递错误信息到模板
  template.url = url; // 传递Web应用URL到模板
  return template.evaluate();
}

3. 模板变量未传递

原.gs代码未将message和url赋值给模板,导致login.html中的模板标签无法渲染。需在创建模板后添加变量赋值:

var template = HtmlService.createTemplateFromFile("login");
template.message = message;
template.url = url;
return template.evaluate();

4. 表单提交默认行为冲突

原按钮是type="submit",点击会触发表单默认提交,导致页面刷新干扰跳转逻辑。可将按钮类型改为button:

<button type="button" onclick="sample()" class="btn btn-primary w-100">Login</button>

5. 初始访问处理

用户首次访问时无参数,应直接返回登录页:

// 添加到doGet函数开头
if (!user || !password) {
  var template = HtmlService.createTemplateFromFile("login");
  template.url = url;
  return template.evaluate();
}

修正后的完整代码

修正后的.gs代码

const url = "https://script.google.com/macros/s/AKfycbyGvCiggfwsHQfcqs5HBFZj2LS0idotzLBGMQUzAoSIn3ucZuPNLR7t4sYigfDyIOY5/exec";
function doGet(e){
  var user = e.parameter.name;
  var password = e.parameter.pass;
  var users = [["admin","123"], ["user","456"], ["guest","789"]];
  var message ='';

  // 初始访问无参数,返回登录页
  if (!user || !password) {
    var template = HtmlService.createTemplateFromFile("login");
    template.url = url;
    return template.evaluate();
  }

  // 验证用户
  let isAuthenticated = false;
  for (var i = 0; i < users.length; i++) {
    if (users[i][0] === user && users[i][1] === password) {
      isAuthenticated = true;
      break;
    }
  }

  if (isAuthenticated) {
    const show = HtmlService.createTemplateFromFile("show");
    return show.evaluate();
  } else {
    message = '登录失败,请重试!';
    var template = HtmlService.createTemplateFromFile("login");
    template.message = message;
    template.url = url;
    return template.evaluate();
  }
}

修正后的login.html代码

<!doctype html>
<html lang="en">

<head>
  <!-- Required meta tags -->
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

  <!-- Bootstrap CSS -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css">

  <title>EPSP-TGGT</title>
  
</head>

<body>

  <div class="container">
    <div class="col-md-6 mx-auto">
      <div class="card">
        <div class="card-body">
          <div class="card-header bg-primary mb-2 text-center text-white">
            Admin
          </div>
          <form id="myForm"> 
            <? if (message) { ?>
              <h4 class="text-danger"><?= message ?></h4>
            <? } ?>           
            <div class="input-group flex-nowrap  mb-2">
              <span class="input-group-text" id="addon-wrapping">@</span>
              <input type="text" class="form-control" id="name" placeholder="Username" required>
            </div>
            <div class="input-group flex-nowrap mb-2">
              <span class="input-group-text" id="addon-wrappingg">@</span>
              <input type="password" class="form-control" id="pass" placeholder="Password" required>
            </div>
            <button type="button" onclick="sample()" class="btn btn-primary w-100">Login</button>            
          </form>
        </div>
      </div>
    </div>
  </div>
  <!-- JS-Code To get user & pass and put them as Paramaters in the script-url -->
  <script>
    function sample() {
      const url = "<?!= url ?>";
      const [name, pass] = ["name", "pass"].map((e) => document.getElementById(e).value);
      window.open(`${url}?name=${name}&pass=${pass}`, "_top");
    }
  </script>

  <!-- Option 2: Separate Popper and Bootstrap JS -->

  <script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.1/dist/umd/popper.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.min.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>


</body>

</html>

注意事项

  • 确保已创建show.html文件作为验证通过后的操作页面
  • 部署Web应用时,权限设置需根据需求选择(如允许匿名访问登录页则选“任何人,甚至匿名”)

内容的提问来源于stack exchange,提问作者user2842276

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 04:55:00