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

使用Sheets用户列表限制Web App访问失效,非授权用户仍可访问,求排查方案

问题排查与修复方案

核心代码逻辑错误

你的代码完全没做当前用户与列表的匹配校验,这是权限控制失效的根本原因:

  1. getDataRange("A2:A")用法错误,getDataRange()方法不需要传参数,要获取A2开始的非空用户列,应该用getRange("A2:A" + sheet.getLastRow()),或者先取整个数据范围再过滤空行。
  2. 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!");
}

额外部署配置检查

  1. 部署Web App时,执行权限要选“以访问者身份执行”,这样才能获取到访问用户的真实邮箱。
  2. 访问权限如果是内部使用,选“仅限组织内用户”;如果选“任何人,甚至匿名用户”,Session.getActiveUser()会返回空,这种场景下没法做邮箱校验,必须限制为需要登录的选项。

其他注意事项

  • 确保用户列表里的邮箱格式和用户登录的邮箱完全一致(Gmail邮箱大小写不敏感,但最好统一格式)。
  • 修改代码后必须重新部署新版本,旧版本的代码不会自动更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 22:57:14