【问题标题】:How to get all old values for a mulitple cell range with onEdit trigger如何使用 onEdit 触发器获取多个单元格范围的所有旧值
【发布时间】:2019-07-28 14:53:13
【问题描述】:

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

【问题讨论】:

    标签: google-apps-script triggers


    【解决方案1】:
    • 您希望在编辑多个单元格时检索旧值。

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

    问题:

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

    解决方法:

    那么作为当前的解决方法,这个流程怎么样?

    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);
    }
    

    注意:

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

    参考资料:

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

    【讨论】:

    • 实际上,这就是我为解决我的问题所做的工作,等待看看是否有一个优雅的解决方案,就像 Event.oldValueS 一样简单,可以检索数组(与 Range.getValues( )),但我想没有,所以我会保留那个!无论如何,谢谢,至少这告诉我我做了正确的事情!干杯
    • @Thomas Perrin 感谢您的回复。我很高兴你的问题得到了解决。也谢谢你。
    猜你喜欢
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    相关资源
    最近更新 更多