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

106

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

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

=LAST(G2:G9999)

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

камбрака
источник

Ответы:

54

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

Сценарий:

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()функциям ячеек и заставить их обновляться. Я просто не могу найти его в документации.

тинифни
источник
5
Это скрипт Google Spreadsheet. Вы можете создать новый сценарий в разделеTools -> Scripts -> Script editor...
tinifni
1
: O Потрясающе! Я не знал, что Google реализовал скрипты. Большое спасибо, все сработало отлично
cambraca
1
есть идеи, как сделать так, чтобы он обновлялся автоматически при изменении данных в таблице?
cambraca
Я отредактировал свой ответ, добавив некоторую информацию, которая должна помочь. Удачного кодирования!
tinifni
5
Я внес изменения в этот скрипт, чтобы вы могли передавать в него именованные листы, например lastValue ("Sheet1! A") gist.github.com/2701061
johnwards
165

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

=INDEX(G2:G, COUNT(G2:G))
Dohmoose
источник
12
Кажется, это работает, пока в наборе данных нет пробелов
Кейт Сирмонс,
Еще один хороший ресурс - это выбранный ответ на странице productforums.google.com/forum/#!topic/docs/p3t3feg7Jic, который показывает, как получить первую, последнюю или n-ю строку в FILTER()диапазоне ed, аналогично ответу @ Geta .
Аарон Бленкуш
В этом ответе stackoverflow.com/a/8161172/418111 есть формула, которая поддерживает пустые ячейки.
Дэниел
8
Как упоминалось в @KeithSirmons. Если в вашем столбце есть пробелы, он не работает, потому что COUNT(G2:G)возвращает 0. Вместо этого используйте, COUNTA(G2:G)что подсчитывает только количество значений в наборе данных. COUNTAполезен только в сочетании с INDEXдля получения последнего значения, если между вашими значениями нет ни одного пробела.
Christiaan Westerbeek
3
Также обратите внимание, что если ваши значения не являются числовыми, вам понадобится COUNTA. COUNTсчитает только числовые значения: он вернет 0 при задании, например, текстовых ячеек.
Воздух,
53

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

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)))))
Getas
источник
2
Вау, это невероятно чисто. Вы можете объяснить, как именно это работает?
cambraca
Не совсем: это правильно, когда исходный диапазон уже отсортирован.
Caligari
5
Объяснено: ROWвозвращает номер строки, поэтому FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )возвращает массив всех непустых номеров строк (не их значений), например [1,2, 3, 7, 12, 14]. Затем MAXдает нам номер последней строки. FILTERЗатем применяется второй , чтобы отфильтровать все строки, в которых номер строки не соответствует значению MAX(то есть значению последней непустой строки).
jhabbott 01
Оба экземпляра ROW можно заменить на COLUMN, чтобы вернуть последнее значение в определенной строке (вместо последнего значения в определенном столбце).
Джон Шнайдер
2
Что, если мне просто нужен номер строки последнего значения столбца?
Nick5a1
44

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

=LAST(G2:G9999)

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

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

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

Калигари
источник
1
Это отлично работает и автоматически обновляется при изменении листа. Спасибо!
TinaMarie
8
Мне нравится краткость этого предложения, но оно не работает, когда целевой диапазон включает несколько пустых ячеек (как указано в исходном вопросе выше), поскольку COUNT () не считает пустые ячейки.
Джон Шнайдер
@JonSchneider вы можете использовать COUNTAв этом случае, если уверены, что между значениями в столбце нет ни одного пробела. Смотрите мои комментарии к ответу dohmoose.
Christiaan Westerbeek
Почему :Gобозначает последний элемент? Это задокументировано?
flow2k
33

Резюме:

=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) )
Дуг Брэдшоу
источник
Очень полезно пройти через шаги и функциональность + ограничения каждой итерации. Мне нужно было получить последнее значение в каждой строке, некоторые с несколькими пробелами. Это сработало как шарм. Спасибо!
Christiaan Adams
9

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

=INDEX(G2:G; COUNTA(G2:G))
user3280071
источник
1
Но только если между вашими значениями нет ни одного пробела. Если есть, в COUNTAсочетании с INDEXне будет возвращать последнее значение в столбце.
Christiaan Westerbeek
7

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

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

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

Эндрю Андерсон
источник
6

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

Craig3353
источник
6

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

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

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

= lastValue(E17:E999)

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

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

Тед Х.
источник
5
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

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

десныки
источник
5

У меня работает:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Педро
источник
Хорошее решение, которое работает и при наличии пустых ячеек.
jochen
5

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

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
Надер
источник
работает и для столбцов. Я просто заменил несколько вещей. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
Джейсон
общее решение:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason
Для меня это «правильный» ответ. Достаточно компактный и простой для понимания, работает с заготовками.
aardvarkk
4

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

=+sort(G:G,row(G:G)*(G:G<>""),)
JPV
источник
Хорошее решение. Я подозреваю, что вариант @ Pedro (с использованием INDEX и MAX) может быть немного более эффективным, чем использование SORT.
jochen
4

Ответ

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

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

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

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

Мануэль Феррейра
источник
Это сообщение было помечено как "Таблица Google" и "Скрипт Google Apps", ничего не связанное с Libre Office ... Вы не по теме
Серж Инсас
Не так уж и далеко от темы, так как заголовок вопроса « Выбор последнего значения столбца» мог легко найти какой-нибудь бедняга с помощью LibreOffice или Numbers. Я любитель электронных таблиц, который знает достаточно, чтобы быть опасным. Что я могу понять, так это то, что Google сделал так, что если ваш второй аргумент для диапазона - это просто столбец, он выберет оставшуюся часть столбца, чтобы людям не приходилось использовать обнаруженный вами хак с очень большими числами.
Аарон
3

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

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

DavidF
источник
3
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());
Мариан
источник
3

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

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

=INDEX(G2:G; COUNT**A**(G2:G))
Педро
источник
4
Нет, это тоже не работает. Разница между COUNT и COUNTA заключается в различии чисел и текста, которое здесь не имеет значения.
mhsmith
2

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

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

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

irriss
источник
1
Не совсем: это правильно, когда исходный диапазон уже отсортирован.
Caligari
2

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

Крис
источник
1

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

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

G2:G<>""создает массив из 1 / истина (1) и 1 / ложь (0). Поскольку LOOKUPдля поиска используется подход сверху вниз, 2и поскольку он никогда не найдет 2, он подходит к последней непустой строке и дает ее позицию.

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

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

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

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

V18 :

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

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

Мастер
источник
1

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

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
player0
источник