很多人问如何获取e.oldValue和e.value。但是,如果通过“粘贴”工作表中另一个单元格上的内容覆盖了内容,如何获得单元格的旧值?这是我所知道的:
让我们以单元格A1中的内容为“foo”和单元格A2中的内容为“bar”。
如果有人通过在其中输入“栏”(包括从外部源粘贴)来覆盖A1:e.value =“bar”和e.oldValue =“foo”。
如果清除了A1,则e.value = {“oldValue”:“foo”},e.oldValue =“foo”。
如果有人复制A2并将其粘贴到A1中而覆盖了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;
最佳答案
请将此视为几种解决方法之一。我认为通过在编辑之前保存数据可能会成为一种解决方法。该示例脚本通过使用在编辑之前保存的电子表格来检索oldValue
。为了使用此示例脚本,请执行以下操作。
var backupfilename = "backupfile";
的“backupfile”修改为唯一的名称。 init()
函数。这样,将创建备份文件,并将要检索oldValue
的工作表复制到该文件。 onEdit(e)
作为可安装的触发器。安装方法如下。之后,当您编辑电子表格时,
onEdit(e)
将从当前电子表格和备份电子表格中检索数据,然后将当前电子表格的数据复制到备份电子表格中。因此,您可以检索已编辑范围的oldValue
和newValue
。共享电子表格的用户也可以通过此示例脚本检索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);
}
如果我误解了您的问题,对不起。
关于google-apps-script - 如果单元格内容是从工作表中的另一个单元格粘贴的,如何获取 "e.oldValue",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46671104/