【问题标题】:How to avoid overwriting if cell already has value如果单元格已经具有值,如何避免覆盖
【发布时间】:2021-02-04 15:57:17
【问题描述】:

我正在使用这个脚本在我的电子表格中包含时间戳,但如果目标单元格已经有时间戳,我不能让它不被覆盖。

我正在使用这个模型,因为它可以同时启用多个条目。

function onEdit(event) {
  var s = SpreadsheetApp.getActiveSheet();

  // Logger.log(JSON.stringify(event)); //DEBUG

  var ecolumnStart = event.range.columnStart;
  var erowStart = event.range.rowStart;
  var erowEnd = event.range.rowEnd;
  var ecolumnEnd = event.range.columnEnd;
  // Logger.log("DEBUG: Range details - Column Start:"+ecolumnStart+", Column End:"+ecolumnEnd+", Row start:"+erowStart+", and Row End:"+erowEnd);
  // Logger.log("DEBUG: the sheet is "+event.source.getName()+", the range = "+event.range.getA1Notation());
  var sName = event.range.getSheet().getName();
  
  var time = new Date();
  var numRows = event.range.rowEnd -event.range.rowStart+1;

    if( event.range.columnStart == 2 && sName == 'Status') { //which column to watch on which sheet
    // loop though the number of rows
    for (var i = 0;i<numRows;i++){
      var row = event.range.rowStart+i;
      SpreadsheetApp.getActiveSheet().getRange('A' + row.toString()).setValue(time); //which column to put timestamp in
    }
  }
}

【问题讨论】:

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


    【解决方案1】:

    设置值前,检查是否有值。

    代码:

    function onEdit(event) {
      var s = SpreadsheetApp.getActiveSheet();
      var sName = event.range.getSheet().getName();
      var time = new Date();
      var numRows = event.range.rowEnd - event.range.rowStart + 1;
    
      if (event.range.columnStart == 2 && sName == 'Status') {
        for (var i = 0; i < numRows; i++) {
          var row = event.range.rowStart + i;
          // Assign to cell to avoid redundancy
          var cell = SpreadsheetApp.getActiveSheet().getRange('A' + row.toString());
          // Write only to cell if it has blank value
          if (cell.getValue() == "") {
            cell.setValue(time);
          }
        }
      }
    }
    

    如果需要非时间戳值并且仍应被覆盖,则更新条件。

    样本输入:

    样本输出:

    请注意,在第 2 列写入时,现有日期 1/1/2021 没有被覆盖。只有空白单元格被写入今天的日期,即 2/5/2021

    编辑:

    如果有 2 个日期列,请使用以下代码:

    代码:

    function onEdit(event) {
      var s = SpreadsheetApp.getActiveSheet();
      var sName = event.range.getSheet().getName();
      var time = new Date();
      var numRows = event.range.rowEnd - event.range.rowStart + 1;
    
      // If column edited is column 3 onwards (since A and B are 'First Seen' and 'Last Update' respectively)
      if (event.range.columnStart == 3 && sName == 'Status') {
        for (var i = 0; i < numRows; i++) {
          var row = event.range.rowStart + i;
          // Assign to cell to avoid redundancy
          // First Seen
          var cell = s.getRange('A' + row.toString());
          // Last Update
          var cell2 = s.getRange('B' + row.toString());
          // If First Seen is blank, update both
          // If First Seen has date, update only column B
          if (cell.getValue() == "") {
            cell.setValue(time);
          }
          cell2.setValue(time);
        }
      }
    }
    

    样本数据:

    样本输出:

    如果 A 列被更新,它不会被覆盖,因为它是该行的第一次更新。 B 列一直在更新,因为那是最后更新的列。

    【讨论】:

    • 这个工作就像一个魅力!另外,我忘了补充:一列不应该覆盖,但另一列应该。类似于“第一次看到”“最后一次编辑”。
    • 在这种情况下,使用 2 列作为日期,一个是第一次看到的,另一个是最后编辑的。在第一次编辑时,填充两者。对于连续编辑,您只需编辑最后编辑的列部分。
    • 如何调整代码以适应这些新参数?
    • 您不需要添加其他参数。只需添加额外的 if 语句。如果最后编辑的单元格有日期,则仅更新最后编辑的列。如果为空,则填充第一次看到和最后编辑的列
    • 我添加了调整后的代码。请检查@Rhendel
    【解决方案2】:

    尝试几次后仍无法正常工作,您能说明一下它应该是怎样的结束格式吗? 我是这方面的新手..

    另外,我忘了补充:一列不应该覆盖,但另一列应该。 类似于“第一次看到”“最后一次编辑”

    【讨论】:

    • 我已经更新了我的答案,请检查更新后的答案。 @Rhendel
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2014-06-18
    • 2021-11-10
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多