Określanie ostatniego wiersza w jednej kolumnie

Mam arkusz z danymi w kolumnach A do H.

Muszę określić ostatni wiersz w kolumnie A, który zawiera dane (Wszystkie sąsiadują ze sobą - brak luk w danych/wierszach).

W innych kolumnach są również dane, które mają więcej wierszy danych niż kolumna A, więc muszę wyizolować tylko kolumnę A. (I/lub tylko zakres w obrębie col A).

Mogę to zrobić na poziomie arkusza kalkulacyjnego używając

=COUNTA(A2:A100)

Jednak we wszystkich moich poszukując rozwiązania skryptowego Google Apps, jedyne, co wydaje mi się znaleźć, to wymagania dotyczące wykonywania wielu funkcji obejmujących dziesiątki linii kodu - w tym mnóstwo rzeczy {8]}... Co mógłbym zrobić mniej skomplikowanie poprzez offsetowanie bezpośrednio z A1.

Czy istnieje jakiś specyficzny dla kolumny sposób modyfikacji tej metody?

var aLast = ss.getDataRange().getNumRows();

Jeśli proces zawiły jest tym, co jest wymagane, to niech tak będzie. Ale trudno mi to sobie wyobrazić (a jeszcze trudniej znaleźć!) prostszy rozwiązanie.

Czy ktoś chce mnie oświecić (lub pop my bubble)?

Author: Mogsdad, 2013-07-13

9 answers

Jak o użyciu sztuczki JavaScript?

var Avals = ss.getRange("A1:A").getValues();
var Alast = Avals.filter(String).length;

Zapożyczyłem ten pomysł z tej odpowiedzi . Na Array.filter() metoda działa na tablicy Avals, która zawiera wszystkie komórki w kolumnie A. filtrując na konstruktorze natywnej funkcji, otrzymujemy tylko elementy inne niż null.

To działa tylko dla jednej kolumny; jeśli zakres zawiera wiele kolumn, to wynik filter() będzie zawierał komórki ze wszystkich kolumn, a zatem będzie poza wypełnionymi wymiarami zasięg.

 86
Author: Mogsdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-13 16:14:19

Chociaż nie ma prostej formuły, myślę o tym, że nie wymaga dziesiątek linii kodu, aby znaleźć ostatni wiersz w kolumnie A. wypróbuj tę prostą funkcję. Użyj go w komórce w normalny sposób, używając innej funkcji =CountColA()

function CountColA(){
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  for(var i = data.length-1 ; i >=0 ; i--){
    if (data[i][0] != null && data[i][0] != ''){
      return i+1 ;
    }
  }
}
 10
Author: Srik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-14 12:14:24

Możesz to zrobić, idąc w odwrotną stronę. Zaczynając od ostatniego wiersza w arkuszu kalkulacyjnym i przechodząc w górę, aż otrzymasz jakąś wartość. Będzie to działać we wszystkich przypadkach, nawet jeśli masz kilka pustych wierszy pomiędzy. Kod wygląda następująco:

var iLastRowWithData = lastValue('A');
function lastValue(column) {
  var iLastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var aValues = SpreadsheetApp.getActiveSheet().getRange(column + "2:" + column + lastRow).getValues();

  for (; aValues[iLastRow - 1] == "" && iLastRow > 0; iLastRow--) {}
  return iLastRow;
}
 4
Author: Akash Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 12:53:51

Przepisałem ponownie funkcje getLastRow/getLastColumn, aby określić indeks wiersza lub indeks kolumny.

function get_used_rows(sheet, column_index){
      for (var r = sheet.getLastRow(); r--; r > 0) {
        if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(r, column_index).getValue() != ""){
          return r;
          break;
        }
      }
    }

function get_used_cols(sheet, row_index){
  for (var c = sheet.getLastColumn(); c--; c > 0) {
    if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(row_index, c).getValue() != ""){
      return c;
      break;
    }
  }
}
 0
Author: Ashton Fei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-04 03:07:04

Aby uzyskać liczbę kolumn lub indeks ostatniej kolumny:

var numColumns = sheet.getLastColumn()

Aby uzyskać numer wierszy lub indeks ostatniego wiersza:

var numRows = sheet.getLastRow()

Gdzie

var sheet = SpreadsheetApp.getActiveSheet()
 0
Author: Ashish Verma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-29 22:15:02

To może być inny sposób na obejście lastrow. Być może będziesz musiał pobawić się kodem, aby dopasować go do swoich potrzeb

    function fill() {
      var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('a1').activate();
      var lsr = spreadsheet.getLastRow();
      lsr=lsr+1;
      lsr="A1:A"+lsr;

      spreadsheet.getActiveRange().autoFill(spreadsheet.getRange(lsr), SpreadsheetApp.AutoFillSeries.DEFAULT_SERIES);
};
 0
Author: Tariq Khalaf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-22 02:11:18
var Direction=SpreadsheetApp.Direction;
var aLast =ss.getRange("A"+(ss.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
 0
Author: Mrityunjay pandey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-23 07:12:48

Oto alternatywny sposób rozwiązania tego problemu. Używa pętli while, ale bierze pod uwagę puste odstępy między wierszami.

function getLastRow (column) {
  var iLastRow = ss.getActiveSheet().getMaxRows();
  var aValues = ss.getActiveSheet().getRange(column + ":" + column).getValues();
  var row = "";
  while(row == ""){
    row = aValues[iLastRow-1];
    iLastRow--;
  }
  return iLastRow;
}
 -1
Author: dnlmzw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-21 09:30:26

Używam getDataRange() po którym następuje getNumRows(). Pierwsza funkcja

Zwraca zakres odpowiadający wymiarom, w których dane są obecne

I druga funkcja

Zwraca liczbę wierszy w tym zakresie.

var ss = SpreadsheetApp.getActiveSpreadsheet();
var ws = ss.getActiveSheet();
var lastRow = ws.getDataRange().getNumRows();
P. S mam nadzieję, że to zadziała we wszystkich przypadkach.
 -1
Author: urwaCFC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 07:16:22