Google Apps Script登录按钮异常及成员姓名获取技术问询
问题解答
1. 空表单直接登录成功的问题
原因
前端未对NRIC和邮箱做空值校验就调用后端接口;同时后端checkLogin函数没判断输入是否为空,当输入为空时,会匹配到表格第一行(表头)的空值(若表头未填写NRIC和邮箱),导致返回成功状态。
修复方案
前端修改(LoginUser函数)
在调用后端前添加空值校验:
function LoginUser() { var username = document.getElementById("username").value; var nric = document.getElementById("nric").value; var email = document.getElementById("email").value; // 新增空值校验 if (!nric.trim() || !email.trim()) { document.getElementById("errorMessage").innerHTML = "请填写NRIC和邮箱!"; return; } google.script.run.withSuccessHandler(function(output) { if(output.status == 'TRUE') { document.getElementById("displayusername").innerHTML = output.name; document.getElementById("page1_id1").className = "page1_class1-off"; document.getElementById("page4_id1").className = "page4_id1"; } else if(output.status == 'FALSE') { document.getElementById("errorMessage").innerHTML = "请使用正确的邮箱和NRIC(含横杠)登录。若无法登录,请联系ERA更新信息:era@era.org.my"; } }).checkLogin(nric,email); }
后端修改(checkLogin函数)
增加空值判断,同时跳过表头行(循环从第2行开始):
function checkLogin(nric,email) { // 新增空值判断 if (!nric.trim() || !email.trim()) { return {status: 'FALSE', name: ''}; } var url = 'https://docs.google.com/spreadsheets/d/1dKcn__IcRnDoXf72HnsVN7L2POSNu8KzKJKpS4jmNrk/edit#gid=0'; var ss= SpreadsheetApp.openByUrl(url); var webAppSheet = ss.getSheetByName("DATA"); var getLastRow = webAppSheet.getLastRow(); // 跳过表头,从第2行开始循环 for(var i = 2; i <= getLastRow; i++) { var sheetNric = String(webAppSheet.getRange(i, 2).getValue()).toUpperCase(); var sheetEmail = String(webAppSheet.getRange(i, 3).getValue()).toUpperCase(); if(sheetNric == nric.toUpperCase() && sheetEmail == email.toUpperCase()) { // 返回成功状态及对应姓名 return {status: 'TRUE', name: webAppSheet.getRange(i, 1).getValue()}; } } return {status: 'FALSE', name: ''}; }
2. toUpperCase在Apps Script是否失效?
没有失效,但要注意两个细节:
- 如果单元格值不是字符串类型(比如数字、空值),直接调用
toUpperCase()会报错,需先转成字符串:String(cell.getValue()).toUpperCase() - 空单元格返回的是空字符串,调用
toUpperCase()没问题,但会匹配空输入(这也是问题1的诱因之一)
上面的修改代码已经处理了类型转换,避免报错。
3. 显示表格中对应成员的姓名
实现逻辑
修改后端checkLogin函数,找到匹配行后,同时返回成功状态和该行第一列的姓名;前端在成功回调中使用后端返回的姓名,替代用户输入的内容。
具体修改
已包含在上述代码中:
- 后端找到匹配行时,返回对象
{status: 'TRUE', name: 对应姓名} - 前端回调中替换为:
document.getElementById("displayusername").innerHTML = output.name;
这样登录成功后就会显示表格中存储的真实姓名,而非用户输入的内容。
内容的提问来源于stack exchange,提问作者dswong
相关产品推荐
相关产品推荐

