电子表格单元格被编辑时如何通过脚本获取对应编辑者的邮箱?
问题根因
1. 触发器权限限制
你当前使用的是简单onEdit触发器,这类触发器权限受限,Session.getActiveUser()仅在所有协作者和脚本所有者属于同一Google Workspace域时才会返回有效值,外部用户或异域用户编辑时会返回空值。而getEffectiveUser()获取的是脚本部署者的身份,所以永远只会返回你自己的账号信息,无法拿到其他编辑者的信息。
2. 代码语法错误
你已经通过Session.getActiveUser().getEmail()获取了字符串类型的邮箱值,后续调用email()相当于把字符串当作函数执行,会直接抛出异常,这也是脚本无输出的直接原因。同时你把Logger.log放在了函数外部,脚本初始化执行时没有编辑事件上下文,自然拿不到对应用户信息。
修复方案
- 改用可安装编辑触发器,这类触发器有更高的接口调用权限,同域内协作者编辑时可以正常获取到对应邮箱
- 修正代码中的语法错误,调整日志输出位置
修正后的代码如下:
function recordEditorEmail() { var s = SpreadsheetApp.getActiveSheet(); // 仅匹配TEST表的编辑操作 if( s.getName() == "TEST" ) { var r = s.getActiveCell(); var email = Session.getActiveUser().getEmail(); Logger.log("当前编辑者邮箱:" + email); // 匹配第4列的编辑操作 if( r.getColumn() == 4 ) { var nextCell = r.offset(0, 1); // 目标单元格为空时才写入邮箱 if( nextCell.getValue() === '' ) { nextCell.setValue(email); } } } }
触发器安装步骤
打开对应谷歌表格 -> 点击顶部「扩展程序」-> 选择「Apps脚本」进入脚本编辑器 -> 点击左侧菜单栏的「触发器」选项 -> 点击右下角「添加触发器」按钮 -> 选择要运行的函数为recordEditorEmail -> 事件来源选择「电子表格」-> 事件类型选择「编辑时」-> 按照页面提示完成权限授权即可。
注意事项
如果表格共享给了非同一Google Workspace域的外部用户,受谷歌隐私政策限制,依然无法获取到这类用户的邮箱信息,仅同域内协作者可正常识别。
内容的提问来源于stack exchange,提问作者Renzo
相关产品推荐
相关产品推荐

