【问题标题】:Time Stamp Script not working on Pasting/Dragging Cell Values时间戳脚本不适用于粘贴/拖动单元格值
【发布时间】:2020-03-18 07:45:22
【问题描述】:

我有一个脚本,它记录在特定单元格中输入的时间戳。它使用 onEdit 触发器。

问题陈述:

当我在相邻单元格范围内(在同一列中)拖动/复制粘贴数据时,只有第一个条目会产生时间戳输出。

代码:

  var s = SpreadsheetApp.getActiveSheet();
  var sName = s.getName();
  var r = s.getActiveCell();
  if( r.getColumn() == 8 && sName == 'Processing') { //which column to watch on which sheet
    var row = r.getRow();
    var time = new Date();
    SpreadsheetApp.getActiveSheet().getRange('CU' + row.toString()).setValue(time); //which column to put timestamp in
  };
 };

【问题讨论】:

  • 我不明白你的问题。你能用一个例子解释一下你期望什么吗?最后,您只更改了一个单元格,请查看getActiveCell() 文档。您能否使用event object 检索范围。

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


【解决方案1】:

您正在使用 onEdit 在编辑字段时插入时间戳。但是,当通过复制/粘贴或拖动单元格/范围进行编辑时,时间戳仅适用于新目标范围中的第一个单元格。

发生这种情况的原因是您的脚本输出仅识别 activecell 而无法识别 activerange 的其余部分

var r = s.getActiveCell(); var row = r.getRow();

您的问题有多种解决方案。

活动范围: 使脚本能够处理活动范围内的行数。

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

  var r = s.getActiveCell();
  var row = r.getRow();
  var ar = s.getActiveRange();
  var arRows = ar.getNumRows()
  // Logger.log("DEBUG: the active range = "+ar.getA1Notation()+", the number of rows = "+ar.getNumRows());
  var time = new Date();

  if( r.getColumn() == 8 && sName == 'Processing') { //which column to watch on which sheet
   // loop through the number of rows
    for (var i = 0;i<arRows;i++){
      var rowstamp = row+i;
      SpreadsheetApp.getActiveSheet().getRange('CU' + rowstamp.toString()).setValue(time); //which column to put timestamp in
    }
  }
 }

事件对象:使脚本能够利用 OnEdit 生成的事件对象。

在以下脚本中,编辑范围工作表名称开始和结束行号 em> 都是使用Event Objects available to onEdit 获得/确定的。

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();
  // Logger.log("DEBUG: the sheet name is "+sName)

  var time = new Date();
  var numRows = event.range.rowEnd -event.range.rowStart+1;

  if( event.range.columnStart == 8 && sName == 'Processing') { //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('B' + row.toString()).setValue(time); //which column to put timestamp in
    }
  }
}

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多