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

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

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

=LAST(G2:G9999)

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

Ответ 1

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

Script:

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

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

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

Ответ 2

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

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

Ответ 4

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

=LAST(G2:G9999)

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

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

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

Ответ 5

Резюме:

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

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

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

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

Ответ 6

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

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

Ответ 7

попробуйте следующее: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

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

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

Ответ 8

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

Ответ 9

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

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

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

= lastValue(E17:E999)

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

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

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

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

Ответ 13

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

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

Ответ 14

Ответ

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

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

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

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

Ответ 15

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

=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

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

Ответ 16

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

Ответ 17

Я играл с кодом, данным @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)

Ответ 19

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

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

Ответ 20

Я удивлен, что никто никогда не давал этот ответ раньше. Но это должно быть самое короткое, и это даже работает в 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)

Найти MAX СТРОКУ ROW строки и передать ее в INDEX

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

V18:

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

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

Ответ 21

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

Ответ 22

для ряда:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

для столбца:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

Ответ 23

чтобы получить последнее значение из столбца, вы также можете использовать функцию MAX с функцией IF

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))