Google Apps Script获取编辑者邮箱异常问题求助
问题分析与解决方案
核心问题原因
- 简单触发器权限限制:你使用的
onEdit是简单触发器,它在受限模式下运行,无法访问需要授权的服务(比如打开另一张表格SpreadsheetApp.openByUrl),也无法获取非脚本所有者/非同域用户的邮箱——这就是其他用户邮箱为空、朋友运行报错的根本原因。 - 冗余代码:原代码中重复执行了
trackingSheet.getRange(newUserRow, 2).setValue(1);,属于无效操作。 - 函数参数不合理:
searchDataColumnWithUser接收表格URL而非表格对象,导致重复打开表格,既低效又可能引发额外权限问题。
解决步骤
1. 替换为可安装触发器
简单触发器无法满足需求,必须改用可安装触发器——它拥有完整授权,能获取所有编辑者邮箱,也能正常访问外部表格。
2. 修改代码
以下是修正后的完整代码:
// 改名避免和简单触发器冲突,作为可安装触发器的执行函数 function trackEdit(e) { // 校验事件对象有效性 if (!e || !e.source) return; const trackingSheetUrl = "你的追踪表格URL"; // 替换为实际URL const trackingSpreadsheet = SpreadsheetApp.openByUrl(trackingSheetUrl); const trackingSheet = trackingSpreadsheet.getSheets()[0]; // 通过事件对象获取编辑者邮箱,可安装触发器中稳定有效 let user = e.user?.getEmail() || "unknown"; if (user === "") user = "error"; // 直接传入表格对象,避免重复打开表格 const userLocation = searchDataColumnWithUser(trackingSheet, user); if (userLocation) { // 找到用户,递增计数 const currentValue = userLocation.getValue(); userLocation.setValue(currentValue + 1); } else { // 未找到用户,新增行记录 const newUserRow = trackingSheet.getLastRow() + 1; trackingSheet.getRange(newUserRow, 1).setValue(user); trackingSheet.getRange(newUserRow, 2).setValue(1); } } // 修正后的用户查找函数,接收表格对象作为参数 function searchDataColumnWithUser(sheet, targetUser) { const userList = sheet.getRange(1, 1, sheet.getLastRow(), 1).getValues(); for (let rowIndex = 0; rowIndex < userList.length; rowIndex++) { if (userList[rowIndex][0] === targetUser) { // 返回对应用户的计数单元格 return sheet.getRange(rowIndex + 1, 2); } } return null; }
3. 创建可安装触发器
- 打开Google表格的脚本编辑器(工具>脚本编辑器)。
- 点击左侧菜单栏的触发器图标(时钟样式)。
- 点击添加触发器,按以下配置设置:
- 选择函数:
trackEdit - 选择部署类型:
Head - 事件源:
从电子表格 - 事件类型:
编辑时
- 选择函数:
- 点击保存,按照提示完成授权(需用你的主邮箱操作,授权时需允许脚本访问相关权限)。
4. 权限补充检查
确保追踪表格已共享给所有编辑主表格的用户,且至少赋予“查看”权限(脚本需要打开并编辑它)。
内容的提问来源于stack exchange,提问作者Mister Ben
相关产品推荐
相关产品推荐

