3

我找不到关于 event.source 对象的任何详细文档,所以我想知道是否可以访问修改范围的先前值,以便我可以将范围的新值与范围的旧值进行比较以进行验证。

谢谢你的帮助。

OnEdit(事件)

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

3 回答 3

3

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

详细信息请参见此处的文档。

但是之前的值在事件中不可用。有一个关于此的增强请求。您应该“加注星标”以跟踪更新并为它投票。

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

于 2012-06-16T22:49:50.820 回答
0

您可以使用 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()) 

}
于 2012-07-22T22:08:34.383 回答
0

这是一个旧帖子,但它是我搜索时出现的第一个帖子,并且已经实施。您可以在文档https://developers.google.com/apps-script/guides/triggers/events#edit中找到详细信息

[来自 Docs] 可以通过 oldValue 访问:编辑前的单元格值(如果有)。仅当编辑的范围是单个单元格时才可用。如果单元格没有以前的内容,将是未定义的。

因此,例如,您可以使用以下脚本记录值:

function onEdit(e){
  Logger.log(e.oldValue);
}

PS:您可以通过从左侧菜单转到执行来查看日志(见下图) 菜单选项截图

于 2022-02-07T06:31:05.840 回答