it-swarm.com.ru

Определение последней строки в одном столбце

У меня есть лист с данными в полях от A до H.

Мне нужно определить последнюю строку в столбце A, которая содержит данные (все они смежные - без пробелов в данных/строках).

Также есть данные в других столбцах, которые имеют больше строк данных, чем столбец A, поэтому мне нужно изолировать только столбец A. (И/или просто диапазон в пределах столбца A). 

Я могу сделать это на уровне электронной таблицы, используя 

=COUNTA(A2:A100)

Однако во всех моих исследованиях для решения Google Apps Script все, что я, похоже, обнаружил, - это требования выполнять несколько функций, охватывающих десятки строк кода, включая множество i++, что я мог бы сделать менее сложным путем смещения непосредственно из A1 ,.

Есть ли какой-нибудь специфичный для столбца способ модификации этого метода?

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

Если требуется запутанный процесс, пусть будет так. Но мне трудно представить (и еще труднее найти!) Более простое решение.

Кто-нибудь хочет просветить меня (или лопнуть мой пузырь)?

40
5th4x4

Как насчет использования трюка JavaScript?

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

Я позаимствовал эту идею у этот ответ . Метод Array.filter() работает с массивом Avals, который содержит все ячейки в столбце A. Фильтруя конструктор нативной функции, мы получаем только ненулевые элементы.

Это работает только для одного столбца; если диапазон содержит несколько столбцов, результат filter() будет включать ячейки из всех столбцов и, таким образом, будет выходить за пределы заполненных измерений диапазона.

106
Mogsdad

Хотя простой формулы не существует, я могу подумать, для поиска последней строки в столбце А не требуются десятки строк кода. Попробуйте эту простую функцию. Используйте его в ячейке обычным способом, как если бы вы использовали другую функцию =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 ;
    }
  }
}
11
Srik

Вы можете сделать это, выполнив обратный путь. Начиная с последней строки в электронной таблице и поднимаясь до получения некоторого значения. Это будет работать во всех случаях, даже если у вас есть несколько пустых строк между .... Код выглядит следующим образом:

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
Akash Garg

Это получит последнюю строку в листе, предполагая, основываясь на столбце A.

function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

Это исправляет @ mrityunjay-pandey частично-правильный ответ.

Чтобы расширить этот ответ, чтобы получить последнюю строку и столбец, мы можем использовать:

function columnToLetter(column) {
  var temp, letter = '';
  while (column > 0) {
    temp = (column - 1) % 26;
    letter = String.fromCharCode(temp + 65) + letter;
    column = (column - temp - 1) / 26;
  }
  return letter;
}

function letterToColumn(letter) {
  var column = 0, length = letter.length;
  for (var i = 0; i < length; i++) {
    column += (letter.charCodeAt(i) - 64) * Math.pow(26, length - i - 1);
  }
  return column;
}

function getLastDataColumn(sheet) {
  var lastCol = sheet.getLastColumn();
  var range = sheet.getRange(columnToLetter(lastCol) + "1");
  if (range.getValue() !== "") {
    return lastCol;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.PREVIOUS).getColumn();
  }              
}

function getLastDataRow(sheet) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange("A" + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

function run() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var [startRow, lastRow] = [2, getLastDataRow(sheet)];
  var [startCol, lastCol] = [1, getLastDataColumn(sheet)];
}
3
Al Johri

Для очень больших таблиц это решение очень быстрое:

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();

};
1
Luciano Pivi

Я переписал функции getLastRow/getLastColumn, чтобы указать индекс строки или индекс столбца. 

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
Ashton Fei

Чтобы получить количество столбцов или индекс последнего столбца:

var numColumns = sheet.getLastColumn()

Чтобы получить количество строк или индекс последней строки:

var numRows = sheet.getLastRow()

где

var sheet = SpreadsheetApp.getActiveSheet()
0
Ashish Verma
var Direction=SpreadsheetApp.Direction;
var aLast =ss.getRange("A"+(ss.getLastRow()+1)).getNextDataCell(Direction.UP).getRow();
0
Mrityunjay pandey

Это может быть еще один способ обойти прошлую жизнь. Возможно, вам придется поиграться с кодом в соответствии с вашими потребностями 

    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
Tariq Khalaf