如何在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
相关产品推荐
相关产品推荐

