Выбор последнего значения столбца - PullRequest
106 голосов
/ 13 ноября 2010

У меня есть электронная таблица с некоторыми значениями в столбце G. Между ними есть пустые ячейки, и мне нужно получить последнее значение из этого столбца в другую ячейку.

Что-то вроде:

=LAST(G2:G9999)

за исключением того, что LAST не является функцией.

Ответы [ 22 ]

163 голосов
/ 14 декабря 2012

Подобный ответ на ответ Caligari , но мы можем привести его в порядок, просто указав полный диапазон столбцов:

=INDEX(G2:G, COUNT(G2:G))
54 голосов
/ 18 ноября 2010

Так что это решение принимает строку в качестве параметра.Он находит, сколько строк в листе.Он получает все значения в указанном столбце.Он перебирает значения от конца к началу, пока не найдет значение, которое не является пустой строкой.Наконец, он возвращает значение.

Сценарий:

function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();

  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return values[lastRow - 1];
}

Использование:

=lastValue("G")

РЕДАКТИРОВАТЬ:

В ответ на комментарий с просьбой об автоматическом обновлении функции:

Лучший способ, который я смог найти, - использовать это с кодом выше:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

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

Обратите внимание, что если вы используете функцию в ячейке, какзаявлено ранее, он будет обновляться после перезагрузки.Может быть, есть способ подключиться к onEdit() и принудительно обновить функции в ячейках.Я просто не могу найти это в документации.

53 голосов
/ 18 февраля 2011

На самом деле я нашел более простое решение здесь:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=en

Это выглядит так:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
43 голосов
/ 13 ноября 2012

Функция LAST () в настоящий момент не реализована, чтобы выбрать последнюю ячейку в диапазоне.Однако, следуя вашему примеру:

=LAST(G2:G9999)

мы можем получить последнюю ячейку, используя пару функций INDEX () и COUNT () следующим образом:

=INDEX(G2:G; COUNT(G2:G))

Существует живой пример в таблице, где я нашел (и решил) ту же проблему (лист Orzamentos, ячейка I5)).Обратите внимание, что он отлично работает, даже ссылаясь на другие листы в документе.

29 голосов
/ 23 декабря 2014

Резюме:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

подробности:

Я просмотрел и попробовал несколько ответов, и вот что я нашел: Самое простое решение (см. Dohmoose 'answer ) работает при отсутствии пробелов:

=INDEX(G2:G; COUNT(G2:G))

Если у вас есть пробелы, это не получается.

Вы можете обработать один пробел, просто изменив значение с COUNT на COUNTA (см. user3280071 ответ ):

=INDEX(G2:G; COUNTA(G2:G))

Однако это не удастся для некоторых комбинаций пробелов. (1 blank 1 blank 1 терпит неудачу для меня.)

Работает следующий код (см. ответ Надера и комментарий Джейсона ):

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )

, но для этого нужно подумать, хотите ли вы использовать COLUMNS или ROWS для данного диапазона.

Однако, если COLUMNS заменить на COUNT, я, кажется, получаю надежную, чистую реализацию LAST:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) ) 

И так как COUNTA имеет встроенный фильтр, мы можем упростить дальнейшее использование

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

Это несколько просто и правильно. И вам не нужно беспокоиться о том, считать ли строки или столбцы. И в отличие от скриптовых решений, он автоматически обновляется с изменениями в электронной таблице.

А если вы хотите получить последнее значение в строке, просто измените диапазон данных:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
9 голосов
/ 06 февраля 2014

Чтобы вернуть последнее значение из столбца текстовых значений, вам нужно использовать COUNTA, поэтому вам потребуется эта формула:

=INDEX(G2:G; COUNTA(G2:G))
7 голосов
/ 22 сентября 2015

попробуйте это: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Предположим, что столбец, в котором вы ищете последнее значение, равен B.

И да, он работает с пробелами.

6 голосов
/ 27 ноября 2011

Похоже, что Google Apps Script теперь поддерживает диапазоны в качестве параметров функции. Это решение принимает диапазон:

// Returns row number with the last non-blank value in a column, or the first row
//   number if all are blank.
// Example: =rowWithLastValue(a2:a, 2)
// Arguments
//   range: Spreadsheet range.
//   firstRow: Row number of first row. It would be nice to pull this out of
//     the range parameter, but the information is not available.
function rowWithLastValue(range, firstRow) {
  // range is passed as an array of values from the indicated spreadsheet cells.
  for (var i = range.length - 1;  i >= 0;  -- i) {
    if (range[i] != "")  return i + firstRow;
  }
  return firstRow;
}

Также см. Обсуждение на справочном форуме скрипта Google Apps: Как заставить формулы пересчитать?

6 голосов
/ 19 февраля 2014

Я посмотрел предыдущие ответы, и они, кажется, работают слишком усердно. Возможно, поддержка сценариев просто улучшилась. Я думаю, что функция выражается так:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

В своей таблице я использую:

= lastValue(E17:E999)

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

Ваш пробег может отличаться, но это работает для меня.

5 голосов
/ 14 июня 2012
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

без жесткого кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...