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


  • 我创建了两个运行onEdit的函数(在命名为onEdit时测试并工作(

  • 第一个设置行的值(新日期(>D列中的7关于C列的编辑

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列中设置公式
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)");

}
}
  • 我创建了两个可安装的触发器来在Edit上运行这些函数,第一个运行良好,但第二个没有触发第一个。第一个函数输入的值不会触发第二个函数。

  • 我所读到的一切都表明,这是在一张纸上运行多个onEdits的方法,但我被困在这里了。

触发器的限制之一是"脚本执行和API请求不导致触发器运行";,这意味着您需要在插入完成时间后手动包含Duration()调用。

下面的例子并不是实现这一点的唯一方法,但它应该让你了解我要描述的内容。

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)");
}

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

在一个电子表格中包含多个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());    
}
}

最新更新