google-apps-script - 如果单元格内容是从工作表中的另一个单元格粘贴的,如何获得 "e.oldValue"

标签 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() 来获取“bar”的“新值”。但是,我如何获得“oldValue”?

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

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

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

最佳答案

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

  • 请修改var backupfilename = "backupfile";的“备份文件”到一个独特的名字。
  • 运行 init() 的函数.这样,备份文件和要检索的工作表就创建好了 oldValue被复制到它。
  • 安装 onEdit(e)作为可安装的触发器。安装方法如下。
  • 在脚本编辑器上
  • 编辑 -> 当前项目的触发器
  • 点击这里,马上添加一个。
  • 将“运行”设置为 onEdit
  • 将“事件”设置为来自电子表格,编辑时

  • 在这些之后,当您编辑电子表格时,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);
    }
    

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

    关于google-apps-script - 如果单元格内容是从工作表中的另一个单元格粘贴的,如何获得 "e.oldValue",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46671104/

    相关文章:

    sql - 循环遍历sql server触发器中的数据

    jquery - val() 不会触发 jQuery 中的 change()

    javascript - 使用 ID 从 Google 表格中查找正确的值 - 避免多个 "else if" block - 构建数组

    javascript - JS - 对象包含数组名称

    javascript - 这是多余的吗?

    javascript - Google 脚本中的序数日期格式(th、rd、st、nd)

    xml - importxml google 电子表格 - 新 Google 表格中出现 "xml content cannot be parsed"错误

    sql-server - 我如何误解 SQL 中的触发器递归?

    javascript - 如何在 Google Apps 脚本的 forEach 循环中设置 Google Sheet 中目标单元格的值?

    javascript - 全局保存数组