在google apps脚本中,使用onEdit触发器,如果编辑范围内有多个单元格,如何获取所有单元格的旧值?在事件对象文档https://developers.google.com/apps-script/guides/triggers/events中,指定oldValue属性为“仅在已编辑范围是单个单元格时可用”。 就我而言,仅当编辑特定列时,才使用Event对象中的onEdit来运行一个函数(需要oldValue和newValue)。当用户仅在我的特定列中选择一个单元格时,它工作正常,但是例如,如果用户选择了几个单元格或整行,则仅检索第一个选定单元格中的数据,但我需要访问特定列的oldValue
答案 0 :(得分:0)
如果我的理解正确,那么这个答案如何?
不幸的是,在当前阶段,当编辑多个单元格时,没有方法可以从事件对象中检索所有旧值。
因此,作为当前解决方法,该流程如何?
通过以上流程,可以创建在编辑单元格时检索旧值的循环。当该流程反映到脚本时,它如下所示。请认为这只是几个答案之一。
使用此脚本时,请在将该脚本复制并粘贴到容器绑定脚本的脚本编辑器中之后,将OnEdit事件触发器安装到onEditByTrigger()
上。 ,在编辑单元格后,您可以在日志中看到当前值和旧值。
var backupfilename = "backupfile";
function copyToo(srcrange, dstrange) {
var dstSS = dstrange.getSheet().getParent();
var copiedsheet = srcrange.getSheet().copyTo(dstSS);
copiedsheet.getRange(srcrange.getA1Notation()).copyTo(dstrange);
dstSS.deleteSheet(copiedsheet);
}
// This is run only one time.
function init() {
// Source
var srcss = SpreadsheetApp.getActiveSheet();
var range = srcss.getDataRange().getA1Notation();
var srcrange = srcss.getRange(range);
var srcsheetname = srcss.getName();
// Destination
var backupfile = DriveApp.getFilesByName(backupfilename);
var dstid = backupfile.hasNext()
? backupfile.next().getId()
: SpreadsheetApp.create(backupfilename).getId();
var dstss = SpreadsheetApp.openById(dstid).getSheets()[0]
var dstrange = dstss.getRange(range);
dstss.setName(srcsheetname);
copyToo(srcrange, dstrange);
PropertiesService.getScriptProperties().setProperty('backupfileid', dstid);
return dstid;
}
function onEditByTrigger(e) {
var columnNumber = 1; // If you want to retrieve the old values when the column "A" is edited, it's 1.
var source = e.source;
var range = e.range;
var dstid = PropertiesService.getScriptProperties().getProperty('backupfileid');
if (!dstid) {
dstid = init();
}
if (e.range.columnStart == columnNumber) {
var range = source.getSheetName() + "!" + range.getA1Notation();
var fields = "sheets(data(rowData(values(formattedValue,userEnteredFormat,userEnteredValue))))";
var currentValue = source.getRange(range).getValues();
var oldValue = SpreadsheetApp.openById(dstid).getRange(range).getValues();
Logger.log("currentValue %s", currentValue)
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);
}
如果这不是您想要的方向,我深表歉意。