谷歌表格中未登录谷歌账号用户修改单元格时onEdit(e)无法触发
问题
已登录用户修改单元格时onEdit函数正常运行,但未登录用户修改时完全无反应,日志中也没有函数执行的记录。该函数仅操作表格未受保护区域,按预期无痕模式打开文件也应触发函数。
用户提供的代码:
function onEdit(e) { const sheet = e.range.getSheet(); const sheetsToWatch = ['Content Workbook']; if (sheetsToWatch.includes(sheet.getName())) { const headers = sheet.getRange(1, 1, 1, sheet.getMaxColumns()).getValues()[0]; const colToWatch = 'Client Feedback'; const colToWatchIndex = headers.indexOf(colToWatch) + 1; const row = e.range.getRow(); const colToSet = 'Feedback Processed'; const colToSetIndex = headers.indexOf(colToSet) + 1; if (e.range.getColumn() === colToWatchIndex && row > 1) { const row = e.range.getRow(); const timestamp = Utilities.formatDate(new Date(), Session.getScriptTimeZone(), "MM/dd/yyyy HH:mm:ss"); sheet.getRange(row, colToSetIndex).setValue("No"); sheet.getRange(row, colToSetIndex + 1).setValue(timestamp); } } }
问题原因
onEdit属于简单触发器,存在权限限制:
- 未登录的匿名用户运行简单触发器时,没有授权访问
Session对象的权限,代码中Session.getScriptTimeZone()这一行会直接导致触发器执行失败,且不会留下任何日志记录。 - 简单触发器无法调用需要授权的服务,
Session就属于这类受限服务。
解决方案
步骤1:修改代码,移除Session依赖
改用表格自身的时区(无需额外授权,且更贴合表格设置)替代Session.getScriptTimeZone(),同时优化冗余代码:
function onEdit(e) { const sheet = e.range.getSheet(); const sheetsToWatch = ['Content Workbook']; // 提前退出,减少嵌套层级 if (!sheetsToWatch.includes(sheet.getName())) return; const headers = sheet.getRange(1, 1, 1, sheet.getMaxColumns()).getValues()[0]; const colToWatchIndex = headers.indexOf('Client Feedback') + 1; const row = e.range.getRow(); if (e.range.getColumn() !== colToWatchIndex || row <= 1) return; const colToSetIndex = headers.indexOf('Feedback Processed') + 1; // 使用表格时区替代Session时区 const timestamp = Utilities.formatDate( new Date(), SpreadsheetApp.getActiveSpreadsheet().getSpreadsheetTimeZone(), "MM/dd/yyyy HH:mm:ss" ); // 批量写入,减少表格读写次数 sheet.getRange(row, colToSetIndex, 1, 2).setValues([["No", timestamp]]); }
步骤2:创建可安装的编辑触发器
简单触发器权限不足,需改为可安装触发器:
- 打开谷歌表格的脚本编辑器
- 点击左侧时钟图标进入「触发器」页面
- 点击「添加触发器」,设置以下参数:
- 选择运行函数:
onEdit - 部署类型:
Head - 事件源:
从电子表格 - 事件类型:
编辑时
- 选择运行函数:
- 完成授权(需用表格所有者或具备编辑权限的账号操作)
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

