onEdit事件对象访问已修改的单元格的上一个值?

时间:2012-06-16 12:17:13

标签: google-apps-script google-sheets

我在event.source对象上找不到任何详细的文档,所以我想知道是否可以访问修改范围的 previous 值,以便我可以比较范围的新值使用旧的验证范围值。

感谢您的帮助。

OnEdit(事件)

function onEdit(event) 
/* Default onEdit Event function */
{
  var ssa = SpreadsheetApp.getActiveSpreadsheet();
  var ss = event.source.getActiveSheet();
  var r = event.source.getActiveRange();
...

2 个答案:

答案 0 :(得分:3)

- 编辑现在看来这是可能的,请看下面的链接和评论。

详细信息请参见文档here

但事件中没有以前的值。有一个enhancement request就此开了。你应该“加注”它以跟踪更新和投票的类型。

现在,要“解决方法”。所有这些都是基于这样一个事实,即您必须自己在其他地方保存原始数据。您可以拥有镜像电子表格或工作表,当原始文件上发生任何onEdit时,您可以转到镜像并获取旧值。这比看起来要复杂得多,因为您还必须通过脚本更新镜像电子表格,但不是电子表格上的所有事件都会触发onEdit事件,例如插入行。因此,您的脚本必须非常智能才能跟上这些内容,这取决于您的使用情况,甚至可能无法实现。

答案 1 :(得分:1)

您可以使用ScriptDB存储信息onLoad(),然后将其读回onEdit()。每次编辑时,您都可以再次调用onLoad()以再次刷新单元格值的数据库,或者只是替换数据库中的相关信息。

在资源>所有触发器菜单中添加notonEdit()以触发FromSpreadsheet> onEdit()事件。

以下是代码:

function onLoad() {

  var db = ScriptDb.getMyDb()

  //get array of the sheet range that has something in it
  var sheet = SpreadsheetApp.getActiveSheet()
  var lastrow = sheet.getLastRow()
  var lastcolumn = sheet.getLastColumn()
  var subsheet = sheet.getRange(1, 1, lastrow, lastcolumn) 
  var values = subsheet.getValues() 

  //write that array into the ScriptDB of the project 
      for (i=1; i<=lastrow; i++){
        for (j=1; j<=lastcolumn; j++){
          var object = {type: "onEditfudge", row: i, column:j, value:values[i-1][j-1]}  
          db.save(object)
          Logger.log(object) //log it to check its correct..
        }
      }    
}

function BeforeonEdit(){

  db = ScriptDb.getMyDb()
  var newrange = SpreadsheetApp.getActiveRange()


  //get 'old value'
  var dbentry = db.query({type: "onEditfudge", row:newrange.getRow(),column:newrange.getColumn()}).next()
  var oldvalue = dbentry.value    

  //overwrite the 'old value' with the 'new value' for the next onEdit() event
 dbentry.value = newrange.getValue()
 db.save(dbentry)

 //return the old value to do something with in the calling function  
 return oldvalue  
}

function notonEdit(){

  //show new and old value    
  Browser.msgBox("Old value is: " + BeforeonEdit() + ". New Value is: " + SpreadsheetApp.getActiveRange().getValue()) 

}