Google Workspace 插件通过工具栏按钮安装onEdit触发器后其他编辑用户无法触发的问题
Google Workspace 插件通过工具栏按钮安装onEdit触发器后其他编辑用户无法触发的问题
嘿,这个问题确实挺诡异的!我帮你梳理下核心差异和解决思路:
先看两种场景的对比
成功场景
- 用户A通过插件菜单里的「Sync this sheet」选项安装onEdit触发器
- 用户A自己编辑表格时能正常触发
onEdit_recordChanges函数 - 其他所有拥有编辑权限的用户编辑表格时,也能正常触发这个触发器
失败场景
- 用户通过工具栏图标打开的侧边栏按钮安装同一个触发器
- 只有安装触发器的用户A自己编辑时能触发
- 其他编辑用户完全无法触发,会出现权限相关的错误(附错误截图)
重要提示:所有用户的权限都是编辑器,权限配置完全一致!
问题根源:触发器的归属不同
这两种安装方式的本质区别在于触发器的创建主体:
- 插件菜单安装:触发器是绑定到当前Google Sheet文档的项目触发器,属于文档本身,所有有编辑权限的用户都能触发它;
- 侧边栏按钮安装:触发器是以当前登录用户的个人身份创建的触发器,属于用户个人,只有创建者自己能触发,其他用户没有权限执行这个触发器关联的函数。
你的代码参考(结合解决方案优化)
你提供的基础代码可以调整为以下形式,确保创建文档级触发器:
function onOpen(e) { menu.addItem('Sync this sheet', 'createSpreadsheetEditTrigger').addToUi() } function createSpreadsheetEditTrigger() { // 先检查是否已存在同名触发器,避免重复创建 const existingTriggers = ScriptApp.getProjectTriggers(); const hasTargetTrigger = existingTriggers.some(trigger => trigger.getHandlerFunction() === 'onEdit_recordChanges'); if (!hasTargetTrigger) { let myInstallTrigger = ScriptApp.newTrigger('onEdit_recordChanges') .forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet()) .onEdit() .create(); } }
解决方案
要让所有编辑用户都能触发,必须保证触发器是文档级的项目触发器,可以按以下步骤调整:
- 优先引导用户通过插件菜单的「Sync this sheet」选项安装触发器(也就是成功场景的方式);
- 如果一定要保留侧边栏安装的入口,修改
createSpreadsheetEditTrigger函数,明确指定为当前文档创建触发器(如上代码所示),同时增加重复触发器检查逻辑; - 确保用户在安装触发器时,授权的是文档相关的权限,而非仅个人权限。
备注:内容来源于stack exchange,提问作者Esone
相关产品推荐
相关产品推荐

