【问题标题】:google sheets timestamp script not updating when deleting or updating a range of cells谷歌表格时间戳脚本在删除或更新一系列单元格时未更新
【发布时间】:2018-01-09 09:06:44
【问题描述】:

这是我第一次发帖,所以我希望我做的一切都是正确的:)

我在谷歌表格中实现了一个脚本,当在该行上编辑单元格时,该脚本会在 B 列中创建一个时间戳。

效果很好,除了:

  1. 当我选择一系列单元格并按“删除”时,即使我修改了多个单元格,也只有一个时间戳更新(活动单元格的时间戳)
  2. 如果我向下拖动以将值从一个单元格向下自动填充到多个单元格中(例如,如果我从 A1 向下拖动到 A5,以使用 A1 中的值填充 A2-A5),那么只有第一个时间戳(例如 A2)更新,其余部分保持原样。

有解决这些问题的方法吗?

这是我的代码

function onEdit(e) {
  var s = SpreadsheetApp.getActiveSheet();
  var r = s.getActiveCell();
  if( r.getColumn() != 2 && e.source.getActiveSheet().getName() === "MySheet") { //checks the column & checks the sheet is the correct one
    var row = r.getRow();
    var time = new Date();
    time = Utilities.formatDate(time, "GMT+10:00", "dd/MM/yyyy HH:mm:ss");
    SpreadsheetApp.getActiveSheet().getRange('B' + row.toString()).setValue(time);
  };
 };

这是一个包含代码的示例电子表格:

https://docs.google.com/a/eventsafetyservices.com.au/spreadsheets/d/1hFtS-diq_8QsWwqFTIlHg8zHxpvVUsDZex0nSuvXizg/edit?usp=sharing

【问题讨论】:

    标签: javascript google-sheets google-api timestamp


    【解决方案1】:

    一般来说,将事件对象用于与该操作相关的所有内容是一种很好的做法。

    处理多行可以通过使用事件的范围来处理,以获取它的范围。

    function onEdit(e) {
      var r = e.range;
    
      if(r.getColumn() !== 2 && r.getSheet().getName() === "MySheet") {
        var row = r.getRow();
        var lastRow = r.getLastRow();
        var time = new Date();
        time = Utilities.formatDate(time, "GMT+10:00", "dd/MM/yyyy HH:mm:ss");
    
        r.getSheet().getRange(row, 2, lastRow - row + 1, 1).setValue(time);
      };
     };
    

    【讨论】:

    • 非常感谢!这样就解决了。我对 javascript 很陌生,尤其是对 google 表格中的 javascript 很陌生。你介意解释一下 e.range 是什么以及为什么它解决了它,以便我理解吗?
    • onEdit 中的e 参数是一个事件对象。事件对象带有新值、旧值和编辑范围等属性。您可以使用getActiveRange 解决它,但是如果您快速工作,这可以在调用onEdit 和调用getActiveRange 函数之间发生变化。您可以阅读有关事件对象的更多信息here
    • 非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多