如果单元格内容是从工作表中的另一个单元格粘贴的,如何获得“e.oldValue”

Dan*_*l B 5 triggers google-sheets google-apps-script

很多人问过如何获得 e.oldValue 和 e.value。但是,如果内容被工作表上另一个单元格中的内容“粘贴”覆盖,我如何获得单元格的旧值?这是我所知道的:

让我们以单元格 A1 的内容为“foo”和单元格 A2 的内容为“bar”。

如果 A1 被某人输入“bar”覆盖(包括从外部来源粘贴):e.value = "bar" 和 e.oldValue = "foo"。
如果 A1 被清除,e.value = {"oldValue":"foo"}, e.oldValue = "foo"。
如果 A1 被某人复制 A2 并将其粘贴到 A1 中:e.value = {} 和 e.oldValue = {}。所以我们必须使用 e.range.getValue() 来获取“bar”的“新值”。但是,我如何获得“oldValue”?

是的,我知道我可以从单元格 A2 中获取它,但是我怎么知道单元格 A1 中被覆盖的内容?这就是我想知道的。

现在我获取我想知道的两个值的代码是:

var newValue = (typeof e.value == "object" ? e.range.getValue() : e.value); 
var oldVlaue = e.oldValue;
Run Code Online (Sandbox Code Playgroud)

Tan*_*ike 5

请将此视为几种解决方法之一。我认为在编辑之前保存数据可能会成为一种解决方法。此示例脚本oldValue使用电子表格检索编辑前保存的数据。为了使用该示例脚本,请执行以下操作。

  1. 请将“backupfile”修改为var backupfilename = "backupfile";唯一的名称。
  2. 运行 的函数init()。这样,就会创建备份文件,并将要检索的工作表oldValue复制到其中。
  3. onEdit(e)作为可安装触发器安装。安装方法如下。
    • 在脚本编辑器上
    • 编辑 -> 当前项目的触发器
    • 点击这里,马上添加一个。
    • 将“运行”设置为 onEdit
    • 将“事件”设置为来自电子表格、编辑时

之后,当您编辑电子表格时,onEdit(e)从当前电子表格和备份电子表格中检索数据,然后将当前电子表格的数据复制到备份电子表格中。这样您就可以检索oldValuenewValue来编辑范围。共享电子表格的用户也可以通过此示例脚本检索oldValue和。newValue

示例脚本:

var backupfilename = "backupfile"; // In this sample, this is a global variable.

function copyToo(srcrange, dstrange) {
    var dstSS = dstrange.getSheet().getParent();
    var copiedsheet = srcrange.getSheet().copyTo(dstSS);
    copiedsheet.getRange(srcrange.getA1Notation()).copyTo(dstrange);
    dstSS.deleteSheet(copiedsheet);
}

// At first, please run this function.
function init() {
  // Source
  var srcss = SpreadsheetApp.getActiveSheet();
  var range = srcss.getDataRange().getA1Notation();
  var srcrange = srcss.getRange(range);

  // Destination
  var backupfile = DriveApp.getFilesByName(backupfilename);
  var dstid = backupfile.hasNext()
    ? backupfile.next().getId()
    : SpreadsheetApp.create(backupfilename).getId();
  var dstrange = SpreadsheetApp.openById(dstid).getSheets()[0].getRange(range);

  copyToo(srcrange, dstrange);
  PropertiesService.getScriptProperties().setProperty('backupfileid', dstid);
}

function onEdit(e) {
  var newValue = e.range.getValues();
  var dstid = PropertiesService.getScriptProperties().getProperty('backupfileid');
  var oldValue = SpreadsheetApp
    .openById(dstid)
    .getSheets()[0]
    .getRange(e.range.getA1Notation())
    .getValues();

  Logger.log("newValue %s", newValue)
  Logger.log("oldValue %s", oldValue)

  // Update backup file
  var range = e.source.getDataRange().getA1Notation();
  var srcrange = e.source.getRange(range);
  var dstrange = SpreadsheetApp.openById(dstid).getSheets()[0].getRange(range);
  copyToo(srcrange, dstrange);
}
Run Code Online (Sandbox Code Playgroud)

如果我误解了你的问题,我很抱歉。