Determining the last row in a single column

前端 未结 19 1257
野性不改
野性不改 2020-11-22 10:46

I have a sheet with data in cols A through H.

I need to determine the last row in column A that contains data (it\'s all conti

相关标签:
19条回答
  • 2020-11-22 11:18

    I rewrote the getLastRow/getLastColumn functions to specify a row index or column index.

    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 讨论(0)
  • 2020-11-22 11:20
    var Direction=SpreadsheetApp.Direction;
    var aLast =ss.getRange("A"+(ss.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
    

    According to the documentation, getNextDataCell is similar to go to the given range and pressing ctrl (command) + the arrow key. So this works because it goes to the las possible row, adds one (arrow down) and then ctrl + UP, so it will definitely get the last row with some content. The only thing that could be improved is to check if last cell + 1 is greater than max cell, and make an specific logic for that case.

    0 讨论(0)
  • 2020-11-22 11:22

    For very large spreadsheets, this solution is very fast:

    function GoLastRow() {
      var spreadsheet = SpreadsheetApp.getActive();
      spreadsheet.getRange('A:AC').createFilter();
      var criteria = SpreadsheetApp.newFilterCriteria().whenCellNotEmpty().build();
      var rg = spreadsheet.getActiveSheet().getFilter().setColumnFilterCriteria(1, criteria).getRange();
    
      var row = rg.getNextDataCell (SpreadsheetApp.Direction.DOWN);  
    
      LastRow = row.getRow();
    
      spreadsheet.getActiveSheet().getFilter().remove();
    
      spreadsheet.getActiveSheet().getRange(LastRow+1, 1).activate();
    
    };
    
    0 讨论(0)
  • 2020-11-22 11:22

    Update from Mogsdad solution,

    var Avals = ss.getRange("A1:A").getValues();
    var Alast = Avals.filter(function(r){return r[0].length>0});

    0 讨论(0)
  • 2020-11-22 11:24

    I've used getDataRegion

    sheet.getRange(1, 1).getDataRegion(SpreadsheetApp.Dimension.ROWS).getLastRow()
    

    Note that this relies on the data being contiguous (as per the OP's request).

    0 讨论(0)
  • 2020-11-22 11:24

    I tried to write up 3 following functions, you can test them for different cases of yours. This is the data I tested with:

    Function getLastRow1 and getLastRow2 will return 0 for column B Function getLastRow3 will return 1 for column B

    Depend on your case, you will tweak them for your needs.

    function getLastRow1(sheet, column) {
      var data = sheet.getRange(1, column, sheet.getLastRow()).getValues();
    
      while(typeof data[data.length-1] !== 'undefined'
         && data[data.length-1][0].length === 0){ 
        data.pop();
      }
      return data.length;
    }
    
    function test() {
      var sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet6');
      Logger.log('Cách 1');
      Logger.log("Dòng cuối cùng của cột A là: " + getLastRow1(sh, 1));
      Logger.log("Dòng cuối cùng của cột B là: " + getLastRow1(sh, 2));
      Logger.log("Dòng cuối cùng của cột C là: " + getLastRow1(sh, 3));
      Logger.log("Dòng cuối cùng của cột D là: " + getLastRow1(sh, 4));
      Logger.log("Dòng cuối cùng của cột E là: " + getLastRow1(sh, 5));
      Logger.log('Cách 2');  
      Logger.log("Dòng cuối cùng của cột A là: " + getLastRow2(sh, 1));
      Logger.log("Dòng cuối cùng của cột B là: " + getLastRow2(sh, 2));
      Logger.log("Dòng cuối cùng của cột C là: " + getLastRow2(sh, 3));
      Logger.log("Dòng cuối cùng của cột D là: " + getLastRow2(sh, 4));
      Logger.log("Dòng cuối cùng của cột E là: " + getLastRow2(sh, 5));
      Logger.log('Cách 3');
      Logger.log("Dòng cuối cùng của cột A là: " + getLastRow3(sh, 'A'));
      Logger.log("Dòng cuối cùng của cột B là: " + getLastRow3(sh, 'B'));
      Logger.log("Dòng cuối cùng của cột C là: " + getLastRow3(sh, 'C'));
      Logger.log("Dòng cuối cùng của cột D là: " + getLastRow3(sh, 'D'));
      Logger.log("Dòng cuối cùng của cột E là: " + getLastRow3(sh, 'E'));
    
    }
    
    function getLastRow2(sheet, column) {
      var lr = sheet.getLastRow();
      var data = sheet.getRange(1, column, lr).getValues();
    
      while(lr > 0 && sheet.getRange(lr , column).isBlank()) {
        lr--;
      }
    
      return lr;
    }
    
    function getLastRow3(sheet, column) {
      var lastRow = sheet.getLastRow();
      var range = sheet.getRange(column + lastRow);
      if (range.getValue() !== '') {
        return lastRow;
      } else {
        return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
      } 
    }
    
    0 讨论(0)
提交回复
热议问题