如何让此脚本仅在编辑特定列时运行? 代码:编辑:if-else:切换案例:测试:

问题描述

纯粹基于执行日志,似乎这个脚本在每次任何人编辑工作表时都在运行,但我只需要在编辑第 3 列或第 7 列时运行它。我在脚本中添加什么来告诉它这样做?我不懂超级脚本,所以非常感谢任何帮助!!

function onEdit() {
  var s = SpreadsheetApp.getActiveSheet();
  if( s.getName() == "FORD" ) {
    var r = s.getActiveCell();
    if( r.getColumn() == 3) {
     
      var nextCell = r.offset(0,19);
      if( nextCell.getValue() === '' )
        nextCell.setValue(new Date()).setNumberFormat('MM/dd/yyyy HH:mm:ss');
    }
    
    if( r.getColumn() == 7) {
      var nextCell = r.offset(0,16);
      if( nextCell.getValue() === '' )
        nextCell.setValue(new Date()).setNumberFormat('MM/dd/yyyy HH:mm:ss');
    }
  }
}

解决方法

你的代码实际上适用于我的代码,这很奇怪吗?如果我正确理解您的问题,您希望您的脚本在第 3 列和第 7 列时运行。我没有看到您的脚本有任何问题,但我认为下面的这种方法应该更好。我们将使用 e 对象来获取您的数据。

代码:

function onEdit(e) {
  var s = e.source.getActiveSheet();

  if( s.getName() == "FORD" ) {
    var r = e.range;

    if( r.getColumn() == 3) {
      var nextCell = r.offset(0,19);
      if( nextCell.getValue() === '' )
        nextCell.setValue(new Date()).setNumberFormat('MM/dd/yyyy HH:mm:ss');
    }
    
    if( r.getColumn() == 7) {
      var nextCell = r.offset(0,16);
      if( nextCell.getValue() === '' )
        nextCell.setValue(new Date()).setNumberFormat('MM/dd/yyyy HH:mm:ss');
    }
  }
}

与您的脚本执行的逻辑几乎相同,但现在,我们不会将数据直接获取到工作表中,而是将 onEdit 事件对象获取。

如果您的意思是 onEdit 函数应该只在编辑第 3 列和第 7 列时TRIGGERED,那是不行的。

每次手动编辑工作表时都会触发

onEdit 函数,无论它是什么范围。我们只能通过添加条件来限制函数做事,但是我们实际上不能在手动编辑完成后停止触发函数。

它总是会在每次手动编辑时运行,这只是一个限制问题,我们限制函数根据我们添加的条件执行操作。 (仅当工作表名称为 FORD 且列 37 被编辑时才运行某些命令等条件)

如果我误解了你的问题,我真诚地道歉。

编辑:

我正在寻找其他来源,看来您可以使用 switch-case 代替经典的 if-else 语句,因为它在大数据中比后者更快。我已经测试过它,它似乎在单次测试中确实有一些显着差异。在大数据中它会明显更快。

if-else:

if-else

切换案例:

switch-case

测试:

  • if-elseswitch-case 的测试相同。
  • 前 3 个测试是对第 3 列的编辑,后 3 个测试是在第 7 列上,最后 3 个是非 3/7 编辑
  • 自下而上读取运行时间
  • 这实际上因测试而异,但粘贴了这些结果,因为它似乎接近平均值。
  • 存在配额,应进行检查。有关详细信息,请参阅 link。如果您想要更多,您可能需要付费订阅。

quota