1

我有一个脚本,它在编辑时从一张表中获取数据,并将最近添加的数据放入 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());
}
4

1 回答 1

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

注意: 在第一次运行时评论邮件调用以避免发送邮件可能很有用(只是为了启动脚本属性)

于 2013-01-04T21:10:47.303 回答