Mam skrypt, który rejestruje stempel czasu, na którym wpisuje się w określonej komórce. Wykorzystuje wyzwalacz Onedit.

Oświadczenie o problemach:

Kiedy przeciągam / kopiuję wklejanie danych w zakresie sąsiednich komórek (w tej samej kolumnie), tylko pierwszy wpis produkuje wyjście ze znaczkami czasu.

KOD:

  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
  };
 };
0
beenuntz 18 marzec 2020, 10:45

1 odpowiedź

Najlepsza odpowiedź

Używasz ONEDIT, aby włożyć znacznik czasu, gdy pole jest edytowane. Ale gdy edycja odbywa się przez kopiowanie / wklej lub przeciąganie komórki / zakresu, znacznik czasu jest stosowany tylko dla pierwszej komórki w nowym zakresie docelowym.

Powodem, dla którego tak się dzieje, jest to, że wyjście skryptu rozpoznaje tylko {x0}} i nie rozpoznaje reszty activerange

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

Istnieje kilka rozwiązań problemu.

ACTIVERANGE : Włącz skrypt w celu przetworzenia liczby wierszy w aktywnym zakresie.

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
    }
  }
 }

Obiekty zdarzeń : Włącz skrypt do skorzystania z obiektów zdarzeń generowanych przez Onedit.

W następnym skrypcie, Edytowany zakres kolumna Nazwa arkusza , numery wiersza zaczynające i kończące Wszystko uzyskane / określone za pomocą Obiekty zdarzeń dostępne dla Oneedit.

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
    }
  }
}
2
Tedinoz 19 marzec 2020, 23:35