You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 09:34:58