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

如何在Google Apps Script网页应用中按用户Gmail地址展示差异化数据并设置权限

基于Google Apps Script网页应用的用户数据隔离实现方案

一、根据登录用户Gmail展示对应Sheet数据的实现步骤

  • 第一步:获取当前登录用户的真实邮箱,调用GAS内置方法Session.getActiveUser().getEmail()即可。注意该方法仅在网页应用配置为「以访问用户的身份执行」时生效,若配置为以开发者身份执行,默认只能拿到开发者本人的邮箱。如果你的业务场景必须要配置为以开发者身份执行网页应用,需要额外开启Google Workspace的域级委派授权才能获取访问者邮箱,个人账号不支持该能力。
  • 第二步:提前在Google Sheet中新增独立的权限映射表,命名为权限配置,至少保留两列内容:第一列存储用户Gmail地址,第二列存储该用户有权限查看的数据范围(可以是对应数据sheet名称、数据行的归属标记、数据分类ID等,可根据业务需求自定义规则)。例如每个用户仅能查看本部门的销售数据,映射表就可以存「用户邮箱+部门ID」,主数据的每一行也同步增加部门ID字段做关联。
  • 第三步:在服务端完成数据过滤逻辑,禁止把全量数据传到前端再做过滤,避免数据泄露。简单的实现示例如下:
// Code.gas 服务端逻辑
function getUserAuthorizedData() {
  // 获取当前访问用户邮箱
  const userEmail = Session.getActiveUser().getEmail();
  const ss = SpreadsheetApp.openById('替换为你的Google Sheet ID');
  // 读取权限配置表
  const permissionSheet = ss.getSheetByName('权限配置');
  const permissionList = permissionSheet.getDataRange().getValues();
  // 匹配当前用户的权限规则
  const userRule = permissionList.find(row => row[0] === userEmail);
  if (!userRule) return []; // 无匹配权限直接返回空
  // 按权限过滤主表数据,以下示例为过滤主表中部门ID和用户权限匹配的行,索引可根据实际表格调整
  const dataSheet = ss.getSheetByName('主数据表');
  const allData = dataSheet.getDataRange().getValues();
  // 示例中主数据表第3列存储部门ID,userRule[1]是权限配置表中该用户对应的部门ID
  const filteredData = allData.filter(row => row[2] === userRule[1]);
  return filteredData;
}

前端页面加载时直接调用上述服务端方法获取数据渲染即可。

二、用户访问权限配置方案

  • 1、网页应用入口权限配置
    部署网页应用时两个核心参数需要正确设置:
    • 「执行身份」选择用户访问网络应用的身份:是获取用户真实邮箱的前提,也避免所有用户共用开发者的Sheet访问权限
    • 「有权访问的用户」根据业务范围选择:内部使用可选你的域名内的用户,仅指定人可访问就选仅限特定用户,手动添加允许访问的用户Gmail地址,不在列表内的用户无法打开网页,从入口完成第一层权限控制
  • 2、数据级权限校验
    所有数据查询逻辑必须放在服务端执行,所有服务端接口被调用时先校验当前用户是否在权限配置表内,无权限直接抛出错误,不要依赖前端做权限判断。
  • 3、原始Sheet权限配置
    原始Google Sheet不要给普通用户开放查看、编辑权限,仅保留开发者的操作权限即可。网页应用通过GAS的授权机制即可完成数据读取,用户不需要直接拥有Sheet的访问权限,避免用户直接打开Sheet获取全量数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:36:02