4

我想知道是否有办法从 onEdit() 事件中获取单元格的原始值。

例如:

  • 单元格 A1 的当前值为“hello”
  • 我通过将其更改为“世界”来编辑 A1
  • 现在,当我尝试从活动范围中获取值时,我会得到“世界”

但我也希望有可能获得原始值,即“你好”。目前有可能吗?

4

5 回答 5

8

如果您正在处理单个单元格,则可以使用 onEdit(e) 和 e.oldValue 。下面的示例在编辑任何单元格时将原始值添加到 A1。如果单元格为空白,则为“未定义”。

function onEdit(e) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var cell = sheet.getActiveCell();
  var origValue = e.oldValue
 sheet.getRange('A1').setValue(origValue);
}
于 2016-04-28T21:42:27.480 回答
2

唯一接近此的代码是使用 onOpen 退出来保存初始值。可以通过多种方式保存初始值。有“用户属性”。我还不知道它们是如何工作的。我是新来的。

您还可以在“onOpen”出口中使用“隐藏”表来保存值。可能还有其他方法,我不知道。

随着您要为其保存原始值的单元格数量的增加,问题变得更加困难。

顺便说一句,您应该了解“onOpen”例程在打开电子表格时触发。碰巧的是,最终用户也可以在 onOpen 处理程序完成执行之前访问并更改单元格值。您可能无法捕获所有初始值。

你应该知道的最后一件事。发生 UNDO 或 REDO 事件时不会触发 onEdit 触发器。单元格的内容可能会发生变化,而您不会知道。

我不知道验证程序是如何工作的。如果例程拒绝一个值,电子表格会恢复原始值吗?如果是这样,那么这可能会解决 onOpen 问题。如果它只是告诉用户该值无效,那将没有多大帮助。

一种可能有效但非常复杂的方法是在电子表格关闭之前保存图像。您将所有“之后”图像发布到第二个电子表格。然后在您的 onEdit 处理程序中查看另一个电子表格中的相应单元格。然后,您决定恢复以前的映像或允许新映像继续进行。

最后一个使用数据表代替第二个电子表格的疯狂想法。

我只是在学习所有这些概念,所以不要问我如何实现它们。我只是明白他们可能是可能的。出于编码和支持目的,它们可能不是最佳选择。但是由于当前的脚本服务不提供之前的图像访问,它是我能做的最好的。您必须了解这个 google 界面是一个客户端-服务器应用程序。您的脚本在服务器上运行。数据更改发生在“客户端”(最终用户)浏览器中。

最后一点:onEdit 触发器不会因为对单元格的 UNDO 或 REDO 更改而触发。所以单元格可能会改变,而您的脚本不知道它。

于 2012-06-16T19:57:26.277 回答
1

我不认为这是可能的。

我想您可以通过在第二张工作表上拥有工作表的精确副本来获得该功能,该工作表会在您的“onEdit”功能结束时自动更新。在该更新之前,第二张表上的数据将具有以前的值。有点棘手,但为什么不呢?-)

编辑:似乎是“当天的问题”,请参阅这篇文章和 Henrique Abreu 的相关评论。

于 2012-06-16T19:57:14.963 回答
0

当您以图形方式更改单元格的值时,可以使用 setComment 方法将原始值作为注释存储在该单元格中。

于 2012-06-16T19:56:31.443 回答
0

你基本上需要做的是创建一个影子表(你可以保护和隐藏它,甚至将它放在一个完全独立的电子表格中)并使用 IMPORTRANGE 函数将原始表的值放入影子表中(这提供了足够的延迟时间以获取编辑之前单元格中的旧值)。

=IMPORTRANGE("enter your original sheet's ID","enter the range you wish to get from the sheet")

请注意,使用此代码,同时编辑多个单元格时,该功能仅适用于第一个单元格。

function onEdit(){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var originalSheet = sheet.getSheetByName('Original');
  var shadowSheet = sheet.getSheetByName('Shadow');
  var editedCell = originalSheet.getActiveCell();
  var cellColumn = editedCell.getColumn();
  var cellRow = editedCell.getRow();
  var oldValue = shadowSheet.getRange(cellRow, cellColumn).getValue();
  var cellValue = editedCell.getValue();
  var editorMail = Session.getActiveUser().getEmail();    \\getting the editor email

if ("The condition you want to meet for the onEdit function to activate"){
    editedCell.setNote(editorMail + "\n" + new Date + "\n" + oldValue + " -> " + cellValue);
  }
}
于 2018-04-12T05:48:43.760 回答