如何让Google Sheets的onEdit函数仅由指定用户触发?
解决方案:仅自己编辑时触发Google表格onEdit脚本
核心需求实现
要让脚本只在你编辑表格时触发,直接在onEdit函数开头加入当前编辑者验证即可。Google Apps Script的e.user对象可获取当前操作的用户邮箱,对比你的邮箱就能过滤掉其他人的编辑触发。
修改后的完整代码
function onEdit(e) { // 替换成你的Google账号邮箱,仅当你编辑时才继续执行脚本 const MY_EMAIL = "your-email@example.com"; if (e.user.getEmail() !== MY_EMAIL) return; const cs = e.source; const cel = e.range; const rw = cel.getRow(); const col = cel.getColumn(); const s1 = cs.getActiveSheet().getName(); const s2 = cs.getSheetByName("TimeZones"); const ZONES = s2.getDataRange().getValues(); if(s1 == '3193:RENA' && rw < 15){ var val = cel.getValue(); Logger.log(val); if(col == 5){ for (var i=0;i<52;i++){ if(ZONES[i][0] == val){ tz = ZONES[i][2]; cel.offset(0,1).setValue(tz); cel.setFontWeight(400)}}} else if(col == 7){ cel.setValue("-"+val) cel.setFontWeight(400)} } }
额外优化建议(解决脚本变慢问题)
除了限制触发者,还能优化现有代码提升运行速度:
- 缓存时区数据:不要每次编辑都重新读取
TimeZones表,用CacheService缓存数据,减少表格读取次数// 替换原ZONES获取部分的代码 const cache = CacheService.getScriptCache(); let ZONES = cache.get("timeZones"); if (!ZONES) { ZONES = s2.getDataRange().getValues(); cache.put("timeZones", JSON.stringify(ZONES), 3600); // 缓存1小时 } else { ZONES = JSON.parse(ZONES); } - 提前退出判断:把工作表名称判断放到更前面,避免不必要的变量定义和数据读取
- 循环优化:把时区数据转成对象映射,替代循环遍历,查找效率更高
// 替换原循环部分的代码 const zoneMap = ZONES.reduce((map, row) => { map[row[0]] = row[2]; return map; }, {}); if (zoneMap[val]) { cel.offset(0,1).setValue(zoneMap[val]); cel.setFontWeight(400); }
内容的提问来源于stack exchange,提问作者RenaMariee
相关产品推荐
相关产品推荐

