可安装触发器以使用多个onEdit

时间:2020-10-21 14:06:05

标签: google-apps-script google-sheets triggers

  • 我创建了2个运行onEdit的函数(经过测试,并在命名为onEdit时可以正常工作)

  • 第一个在C列的onEdit中设置D列中> 7的行的值(新日期)。

function CompleteTime() { //Function to add a time stamp to Complete Time Column D
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row>7 && col==3){
    sheet.getRange(row, 4).setValue(new Date());
    
  }
}
  • 第二个在第8行E列的第8行E列中设置公式
function Duration() { //Function to set formula in column E to calculate duration from start time to first complte time
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 && col==4){
    sheet.getRange(row, 5).setFormula("=SUM(D8-B3)");
    
  }
}
  • 我创建了2个可安装的触发器来在onEdit上运行这些功能,第一个可以正常运行,但是第二个不会触发第一个。第一个功能输入的值不会触发第二个功能。

  • 我读过的所有内容都表明这是使多个onEdits在单个工作表中运行的方法,但是我被困在这里。

2 个答案:

答案 0 :(得分:1)

在一个电子表格中有多个onEdit触发器不是一个好习惯

在使用简单的onEdit触发器的情况下,每个Apps Script项目不能有多个触发器,在可安装的情况下-可能会导致冲突。

相反,触发器上只能绑定一个函数,然后根据条件从那里调用其他函数。

示例:

function bindmeOnTrigger() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 && col==4){
    function1();    
  } else if(row>7 && col==3){
    function2();    
  }
}
function function1(){
  ...
}
function function2(){
  ...
}

或者简单地:

function bindmeOnTrigger() {  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var range = sheet.getActiveCell();
  var row = range.getRow();
  var col = range.getColumn()
  if(row==8 && col==4){
    sheet.getRange(row, 5).setFormula("=SUM(D8-B3)");    
  } else if(row>7 && col==3){
    sheet.getRange(row, 4).setValue(new Date());    
  }
}

答案 1 :(得分:1)

restrictions触发器之一是“脚本执行和API请求不会导致触发器运行”,这意味着您需要在插入完成时间之后手动包括Duration()调用。 / p>

下面的示例不是完成此操作的唯一方法,但它应该使您了解我要描述的内容。

function onEdit(e) {
  var row = e.range.rowStart;
  var col = e.range.columnStart;
  
  if (row == 8 && col == 4) {
    insertDurationFormula(e.range.offset(0, 1));
  } else if (row > 7 && col == 3) {
    insertCurrentTime(e.range.offset(0, 1));
    insertDurationFormula(e.range.offset(0, 2));
  }
}

function insertCurrentTime(cell) {
  cell.setValue(new Date());
}

function insertDurationFormula(cell) {
  cell.setFormula("=SUM(D8-B3)");
}

还要注意,我使用的是编辑触发器附带的event object。使用事件对象可以帮助简化代码并减少不必要的调用。