你怎么得到" e.oldValue"如果单元格内容是从Sheet中的另一个单元格粘贴的

时间:2017-10-10 16:01:35

标签: google-apps-script google-sheets triggers

很多人都问过如何获得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()来获取我们的新值#34; " bar"。但是,我如何获得" oldValue" ??

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

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

var newValue = (typeof e.value == "object" ? e.range.getValue() : e.value); 
var oldVlaue = e.oldValue;

1 个答案:

答案 0 :(得分:3)

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

  1. 请修改" backupfile" var backupfilename = "backupfile";的唯一名称。
  2. 运行init()的函数。这样,就会创建备份文件,并将要检索的工作表oldValue复制到其中。
  3. 安装onEdit(e)作为可安装的触发器。安装方法如下。
    • 在脚本编辑器上
    • 编辑 - >当前项目的触发器
    • 点击此处立即添加一个。
    • 设置"运行"到onEdit
    • 设置"活动"从电子表格,在编辑
  4. 在此之后,当您编辑电子表格时,onEdit(e)会执行从当前电子表格和备份电子表格中检索数据,然后将当前电子表格的数据复制到备份电子表格中。因此,您可以检索已编辑范围的oldValuenewValue。此外,共享电子表格的用户还可以通过此示例脚本检索oldValuenewValue

    示例脚本:

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

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