如何使用onEdit触发器获取多个单元格区域的所有旧值

时间:2019-07-28 14:53:13

标签: google-apps-script triggers

在google apps脚本中,使用onEdit触发器,如果​​编辑范围内有多个单元格,如何获取所有单元格的旧值?在事件对象文档https://developers.google.com/apps-script/guides/triggers/events中,指定oldValue属性为“仅在已编辑范围是单个单元格时可用”。 就我而言,仅当编辑特定列时,才使用Event对象中的onEdit来运行一个函数(需要oldValue和newValue)。当用户仅在我的特定列中选择一个单元格时,它工作正常,但是例如,如果用户选择了几个单元格或整行,则仅检索第一个选定单元格中的数据,但我需要访问特定列的oldValue

1 个答案:

答案 0 :(得分:0)

  • 您要在编辑多个单元格时检索旧值。

如果我的理解正确,那么这个答案如何?

问题:

不幸的是,在当前阶段,当编辑多个单元格时,没有方法可以从事件对象中检索所有旧值。

解决方法:

因此,作为当前解决方法,该流程如何?

  1. 复制活动的电子表格。
    • 这只能运行一次。
  2. 在编辑单元格时,通过比较活动电子表格和复制的电子表格来检索旧值。
  3. 更新复制的电子表格。

通过以上流程,可以创建在编辑单元格时检索旧值的循环。当该流程反映到脚本时,它如下所示。请认为这只是几个答案之一。

示例脚本:

使用此脚本时,请在将该脚本复制并粘贴到容器绑定脚本的脚本编辑器中之后,将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);
}

注意:

  • 这是一个示例脚本,用于在编辑多个单元格时检索旧值。因此,如果您使用此脚本,请根据您的情况进行修改。

参考:

如果这不是您想要的方向,我深表歉意。