it-swarm.com.ru

Выбор последнего значения столбца

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

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

=LAST(G2:G9999)

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

107
cambraca

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

Автор сценария:

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")

EDIT:

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

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

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

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

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

53
tinifni

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

=INDEX(G2:G, COUNT(G2:G))
161
dohmoose

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

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)))))
52
Getas

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

=LAST(G2:G9999)

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

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

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

42
caligari

Резюме:

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

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

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

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

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

Вы можете обработать один пробел, просто изменив COUNT на COUNTA (См. ser3280071's answer ):

=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) )
28
Doug Bradshaw

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

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

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

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

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

6
Andrew Anderson

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

// 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: Как заставить формулы пересчитать?

5
craig3353

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

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

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

= lastValue(E17:E999)

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

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

5
Ted H.
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

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

4
desnyki

В столбце с пробелами вы можете получить последнее значение с помощью

=+sort(G:G,row(G:G)*(G:G<>""),)
4
JPV

Этот работает для меня:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
4
Pedro

Это получает последнее значение и обрабатывает пустые значения:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
4
Nader

Ответ

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

не работает правильно в LibreOffice. Однако с небольшими изменениями все работает отлично.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

Это всегда работает, только если истинный диапазон меньше, чем (G2:G10000)

3
Manuel Ferreira

Допустимо ли отвечать на исходный вопрос строго не по теме :) Вы можете написать формулу в таблице для этого. Гадкий, может быть? но эффективен при нормальной работе с электронной таблицей.

=indirect("R"&ArrayFormula(max((G:G<>"")*row(G:G)))&"C"&7)


(G:G<>"") gives an array of true false values representing non-empty/empty cells
(G:G<>"")*row(G:G) gives an array of row numbers with zeros where cell is empty
max((G:G<>"")*row(G:G)) is the last non-empty cell in G

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

2
DavidF

Я играл с кодом, предоставленным @tinfini, и думал, что люди могут извлечь выгоду из того, что я считаю немного более изящным решением (заметьте, я не думаю, что сценарии работали совершенно так же, как при создании оригинального ответа) ...

//Note that this function assumes a single column of values, it will 
//not  function properly if given a multi-dimensional array (if the 
//cells that are captured are not in a single row).

function LastInRange(values) 
{
  for (index = values.length - 1; values[index] == "" && index > 0; index--) {}
  return String(values[index]);
}

В использовании это будет выглядеть так:

=LastInRange(D2:D)
2
Jonathan Cavell
function getDashboardSheet(spreadsheet) {
  var sheetName = 'Name';
  return spreadsheet.getSheetByName(sheetName);
}
      var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);  
      var dashboardSheet = getDashboardSheet(spreadsheet);
      Logger.log('see:'+dashboardSheet.getLastRow());
2
Marian

Я нашел другой способ, может быть, это поможет вам

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) - вернет последнюю строку

Дополнительная информация от anab здесь: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI

1
irriss

Нашли небольшое изменение, которое помогло убрать пробелы с нижней части стола. = Индекс (G2: G, СЧЕТЕСЛИ (G2: G, "<>"))

1
Chris

Я удивлен, что никто никогда не давал этот ответ раньше. Но это должно быть самое короткое, и это даже работает в Excel:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>"" создает массив 1/true (1) и 1/false (0). Так как LOOKUP делает нисходящий подход, чтобы найти 2 и поскольку он никогда не найдет 2, он подходит к последней непустой строке и дает позицию этого.

Другой способ сделать это, как могли бы упомянуть другие:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Найти MAXimum ROW непустой строки и передать его в INDEX

В нулевом пустом массиве прерываний использование INDIRECTRC с COUNTBLANK является еще одним вариантом. Если V4: V6 занят записями, то

V18:

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

даст позицию V6.

1
TheMaster

Что касается комментария @ Jon_Schneider, если в столбце есть пустые ячейки, просто используйте COUNTA ()

=INDEX(G2:G; COUNT**A**(G2:G))
1
pedro