onEdit(e)触发器不会在Google表格中自动调用功能

时间:2018-08-23 15:54:39

标签: google-apps-script google-sheets

我正在尝试使用自己的函数(在此问题中显示虚拟函数)计算一些值,并且我希望该函数在用户编辑给定范围内的单元格时触发,但是即使在编写触发器后,唯一一次再次计算该值的时间是我转到脚本编辑器并单击 Save

我的功能:

function calculate(column) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var column = sheet.getActiveCell().getColumn();

  var values2d = sheet.getRange(1, 1, 15).getValues();
  var values = [].concat.apply([], values2d);

  var testRange2d = sheet.getRange(1, column, 15).getValues();
  var testRange = [].concat.apply([], testRange2d);

  var sum = 0;
  for (var i = 0; i < 15; i++) {
    if (testRange[i] == true) sum += values[i]
  }

  return sum;
}

function onEdit(e) {
  var activeCell = SpreadsheetApp.getActiveSheet().getActiveCell();
  if (activeCell.getBackground() === "#e3f5a2") activeCell.setBackground("#ffffff");
  else activeCell.setBackground("#e3f5a2");
  calculate();
}

然后是工作表:

enter image description here

除total之外的单元格是我调用函数的地方。而且,该值只会手动或如前所述进行更新,但是即使在触发事件时,我也曾尝试在触发器中执行其他操作,例如更改随机单元格的值,但是仍然有效。

1 个答案:

答案 0 :(得分:1)

可能我建议以下内容。仅当更改第2列中的复选框时,才会发生这种情况。

function onEdit(event) {
  try {
    var sheet = event.source.getSheetByName("Sheet1")
    if( event.range.getSheet().getName() === "Sheet1" ) {
      if( event.range.getColumn() === 2 ) {
        var values = sheet.getRange(1,1,15,2).getValues();
        var sum = 0;
        for( var i=0; i<values.length; i++ ) {
          if( values[i][1] ) sum += values[i][0];
        }
        sheet.getRange(16,2,1,1).setValue(sum);
        if( event.range.getBackground() === "#e3f5a2" ) 
          event.range.setBackground("#ffffff");
        else
          event.range.setBackground("#e3f5a2");
      }
    }
  }
  catch(err) {
    SpreadsheetApp.getUi().alert(err);
  }
}