Сценарий отметки времени не работает при вставке / перетаскивании значений ячеек - PullRequest
0 голосов
/ 18 марта 2020

У меня есть скрипт, который записывает отметку времени, в которую запись сделана в указанной ячейке c. Он использует триггер 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
  };
 };

1 Ответ

2 голосов
/ 20 марта 2020

Вы используете onEdit для вставки метки времени при редактировании поля. Но когда редактирование выполняется путем копирования / вставки или перетаскивания ячейки / диапазона, отметка времени применяется только для первой ячейки в новом целевом диапазоне.

Причина, по которой это происходит, заключается в том, что выходные данные сценария распознают только activecell и не распознает остальные activerange

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

Есть несколько решений вашей проблемы.

ActiveRange : включить сценарий для обработки количества строк в активном диапазоне.

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.

В следующем скрипте отредактированный диапазон , столбец , имя листа , начальные и конечные номера строк все получены / определены с использованием Объектов событий, доступных для 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
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...