使用Sheets用户列表限制Web App访问失效,非授权用户仍可访问,求排查方案
问题排查与修复方案
核心代码逻辑错误
你的代码完全没做当前用户与列表的匹配校验,这是权限控制失效的根本原因:
getDataRange("A2:A")用法错误,getDataRange()方法不需要传参数,要获取A2开始的非空用户列,应该用getRange("A2:A" + sheet.getLastRow()),或者先取整个数据范围再过滤空行。usersData.find(r => r[0] !== "")只是找第一个非空行,根本没对比当前访问的用户。你需要先获取当前用户的邮箱,再判断这个邮箱是否在用户列表里。
修正后的代码示例
// Authentication function doGet() { // Web App必须用doGet/doPost作为入口函数,自定义test函数如果没设为入口会失效 var ssID = "你的表格ID"; // 确保ssID变量已正确定义 var sheet = SpreadsheetApp.openById(ssID).getSheetByName("Users"); var usersData = sheet.getRange("A2:A" + sheet.getLastRow()).getValues(); // 获取当前访问用户的邮箱 var currentUserEmail = Session.getActiveUser().getEmail(); // 检查当前用户是否在列表中 var isAuthorized = usersData.some(row => row[0] === currentUserEmail); if (!isAuthorized) { return HtmlService.createHtmlOutput("You're not authorized"); } // 授权通过后返回正常内容 return HtmlService.createHtmlOutput("Welcome!"); }
额外部署配置检查
- 部署Web App时,执行权限要选“以访问者身份执行”,这样才能获取到访问用户的真实邮箱。
- 访问权限如果是内部使用,选“仅限组织内用户”;如果选“任何人,甚至匿名用户”,
Session.getActiveUser()会返回空,这种场景下没法做邮箱校验,必须限制为需要登录的选项。
其他注意事项
- 确保用户列表里的邮箱格式和用户登录的邮箱完全一致(Gmail邮箱大小写不敏感,但最好统一格式)。
- 修改代码后必须重新部署新版本,旧版本的代码不会自动更新。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

