有没有办法在onEdit()中获取单元格的原始值?

时间:2012-06-16 19:32:47

标签: triggers google-apps-script

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

例如:

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

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

5 个答案:

答案 0 :(得分:4)

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

Booking.without(:child_bookings)

答案 1 :(得分:2)

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

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

随着细胞数量的增加,问题变得更加困难 你想保存原始值。

顺便说一下,你应该明白“onOpen”例程当时会触发 电子表格已打开。碰巧的是,最终用户也有访问权限 可以在onOpen处理程序完成执行之前更改单元格值。你可以 没有捕获所有初始值。

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

我不知道验证例程是如何工作的。如果例程拒绝一个值,那么 电子表格还原原始值?如果确实如此,那么这可能会解决 onOpen问题。如果它只告诉用户该值无效,则不会 很有帮助。

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

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

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

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

答案 2 :(得分:1)

我认为这不可能。

我想你可以通过在第二张纸上准确复制纸张来获得该功能,当你的'onEdit'功能结束时,它会自动更新。 在更新之前,第二张表上的数据将具有前一个值。 有点棘手,但为什么不呢? - )

编辑:似乎是'当天的问题',请参阅this post和Henrique Abreu的相关评论。

答案 3 :(得分:0)

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

答案 4 :(得分: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);
  }
}