Google Apps Script异常:无法获取授权协作者的编辑者邮箱
解决Google Apps Script onEdit触发器无法获取协作者邮箱的问题
我写了一段Google Apps Script的onEdit触发器代码,需求是当Google表格A列被修改时,自动把编辑者的邮箱填入对应行的F列;如果A列内容被删除,就清空对应F列的内容。但目前这段代码只对我自己有效,已经获取权限的第二位协作者编辑时,F列无法显示他们的邮箱。原代码如下:
function onEdit(e) { const range = e.range; const sheet = range.getSheet(); const editedColumn = range.getColumn(); const editedRow = range.getRow(); // Check if the edit is in column A if (editedColumn === 1) { // If content is deleted in column A, clear the corresponding cell in column F if (range.isBlank()) { sheet.getRange(editedRow, 6).clearContent(); // Clear content in column F } else if (editedRow > 1) { // Avoid clearing header row // Get the email of the editor const editorEmail = e.user.email; // Update the corresponding cell in column F with the editor's email sheet.getRange(editedRow, 6).setValue(editorEmail); } } }
问题原因
问题出在简单触发器的权限限制。默认的onEdit简单触发器运行在受限模式下,没有访问用户敏感信息(比如邮箱)的权限,只有脚本所有者自己操作时能读取e.user.email,协作者操作时会因权限不足无法获取该值。
解决方案
必须换成可安装的onEdit触发器,并授予对应的敏感权限,具体步骤如下:
1. 修改脚本代码
将原函数重命名(避免和简单触发器冲突),调整权限相关的获取邮箱逻辑:
function trackEditor(e) { const range = e.range; const sheet = range.getSheet(); const editedColumn = range.getColumn(); const editedRow = range.getRow(); // 仅处理A列的编辑,且跳过表头行 if (editedColumn === 1 && editedRow > 1) { if (range.isBlank()) { // A列内容删除时,清空对应F列 sheet.getRange(editedRow, 6).clearContent(); } else { // 获取编辑者邮箱(可安装触发器有权限访问) const editorEmail = Session.getActiveUser().getEmail(); sheet.getRange(editedRow, 6).setValue(editorEmail); } } }
2. 创建可安装触发器
- 打开Google表格的脚本编辑器,点击左侧「触发器」图标(闹钟形状)
- 点击「添加触发器」按钮,配置以下选项:
- 要运行的函数:
trackEditor - 部署来源:
Head - 事件源:
从电子表格 - 事件类型:
编辑时
- 要运行的函数:
- 保存后会弹出授权窗口,完成授权(若出现「此应用未验证」提示,点击「高级」→「转到XX脚本(不安全)」继续即可,属于自定义脚本的正常情况)。
注意事项
- 确保协作者已获得表格的编辑权限,否则触发器无法捕获他们的操作。
- 可安装触发器的权限是基于脚本所有者的授权,因此所有协作者的编辑操作都会以所有者的权限执行,从而能正常获取编辑者邮箱。
内容的提问来源于stack exchange,提问作者Shuhrat Zakirov
相关产品推荐
相关产品推荐

