如何在Google Sheets编辑事件中捕获非创建者用户邮箱?
解决Google Sheets编辑事件中获取操作用户邮箱的问题
核心原因
简单触发器(onEdit)运行在操作用户的上下文,但如果用户未授权脚本,Session.getActiveUser().getEmail()会返回空值;普通可安装触发器若未正确利用事件对象的用户属性,也无法获取邮箱。只有以表格管理员身份创建的可安装触发器,才能通过事件对象拿到所有操作用户的邮箱。
解决方案步骤
1. 替换触发器类型
删除原有简单onEdit触发器,创建可安装的onEdit触发器:
- 打开表格的脚本编辑器(工具 → 脚本编辑器)
- 点击左侧时钟图标进入触发器管理页面
- 点击「添加触发器」,配置:
- 运行函数:
handleEditEvent - 部署来源:从表格
- 事件类型:当编辑时
- 运行函数:
- 按提示完成授权(必须用表格所有者/管理员账号操作)
2. 修正代码逻辑
用事件对象的e.user.getEmail()替代Session.getActiveUser().getEmail(),修改后的完整代码如下:
var CONFIG = { SPREADSHEET_URL: '*/edit', // 替换为实际表格URL OWNER_EMAIL: ['xxxxx@gmail.com', 'yyyy@pirs.ooo'], EDITORS_TO_REMOVE: {"Агама":['zzzz@gmail.com'],"Юнифрост":['uuuu@gmail.com']} }; function handleEditEvent(e) { if (!e || !e.range) { Logger.log('handleEditEvent 未接收到有效事件'); return; } // 从事件对象获取操作用户邮箱 const userEmail = e.user ? e.user.getEmail() : ''; if (!userEmail) { Logger.log('无法获取用户邮箱'); return; } Logger.log("当前用户: " + userEmail); processGateEdit(e, userEmail); } // 提取原编辑逻辑为独立函数 function processGateEdit(e, userEmail) { const sheet = e.source.getActiveSheet(); const row = e.range.rowStart; const col = e.range.columnStart; const gateRanges = [ { clientCol: 3, gateCol: 4, windowCol: 5, name: 'Ворота 1' }, // C-E { clientCol: 6, gateCol: 7, windowCol: 8, name: 'Ворота 2' }, // F-H { clientCol: 9, gateCol: 10, windowCol: 11, name: 'Ворота 3' } // I-K ]; let processed = false; for (const range of gateRanges) { if ([range.clientCol, range.gateCol, range.windowCol].includes(col)) { handleGateEdit(sheet, row, range, userEmail, e); processed = true; break; } } if (!processed) return; } // 权限校验与编辑处理逻辑 function handleGateEdit(sheet, row, range, userEmail, e) { // 管理员直接放行 if (CONFIG.OWNER_EMAIL.includes(userEmail)) { return; } // 校验用户是否有权限编辑当前时段 let allowed = false; const clientName = sheet.getRange(row, range.clientCol).getValue(); // 检查用户是否属于当前客户公司,且编辑的是预留/空时段 if (CONFIG.EDITORS_TO_REMOVE[clientName] && CONFIG.EDITORS_TO_REMOVE[clientName].includes(userEmail)) { // 这里补充你的业务逻辑:比如检查时段是否为空或属于该公司 allowed = true; } // 无权限则撤销编辑并提示 if (!allowed) { e.range.setValue(e.oldValue); SpreadsheetApp.getUi().alert('你没有权限编辑该时段'); } }
3. 关键注意点
- 触发器必须由表格管理员创建,否则无法获取
e.user信息 - 授权时必须允许脚本访问用户电子邮箱地址
- 若用户未登录Google账号编辑表格,仍无法获取邮箱(这种情况需限制匿名编辑)
内容的提问来源于stack exchange,提问作者IvanSTV




