使用程序化编辑触发onEdit()

时间:2013-01-04 20:47:48

标签: google-apps-script google-sheets

我有一个脚本在编辑时从一张纸上获取数据,并将最近添加的数据放入ScriptDb。

当我实际打开工作表并进行编辑时,onEdit()触发器成功触发。

但是,此工作表是通过脚本以编程方式编辑的。 onEdit()是否能够根据脚本所做的编辑触发?我无法做到这一点。

使用onEdit()触发器触发的脚本是:

function sheetWasEdited(event) {
  var sheet = SpreadsheetApp.getActiveSheet();
  var lastRow = sheet.getLastRow();
  var lastRowValues = sheet.getRange(lastRow, 2, 1, 2).getValues()[0];
  CgcEmailDatabase.addEmail(now=lastRowValues[0].toString(), email=lastRowValues[1].toString());
}

1 个答案:

答案 0 :(得分:2)

onEdit触发器适用于实际用户编辑电子表格的情况,您描述的用例应该很容易实现,只需从另一个函数调用sheetWasEdited()函数,如果最新版本是同一个函数的一部分项目

如果更改是从其他项目(另一个电子表格或Web应用程序)进行的,那么它将变得非常难以实施。 (如果是您的使用案例,请告诉我们)


按照您的意见编辑:

我们的想法是监视工作表的长度,将值保留在某处(例如在脚本属性中),如果已添加行,则调用函数。

这个小代码应该可以解决这个问题,你应该设置一个时间触发器来偶尔调用lookatsheet(),这取决于你需要多快的反应...我会说每小时或者30分钟都应该你决定不要太多。

function lookatsheet(){
  var ss = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxx');// the ID of the SS you want to look at
  var sh = ss.getSheets()[0];// first sheet
  var lastrow = sh.getLastRow();
  var formertest = ScriptProperties.getProperty('lastTest');// recover the value from the last test (will need to get called once to initiate a valid value)
  if (formertest < lastrow){
    sheetWasEdited(lastrow);// call your function with lastRow as parameter
    ScriptProperties.setProperties({'lastTest': lastrow}, true);   // store for next time
}
}

function sheetWasEdited(row) {  // modified to work with the other function
  var sheet = SpreadsheetApp.openById('xxxxxxxxxxxxxxxxxxxxx').getSheets()[0]
  var lastRowValues = sheet.getRange(row, 2, 1, 2).getValues()[0];
  CgcEmailDatabase.addEmail(now=lastRowValues[0].toString(), email=lastRowValues[1].toString());
}

注意: 可能有助于在第一次运行时注释邮件调用以避免发送邮件(仅用于启动脚本属性)