Ответы:
Итак, это решение принимает строку в качестве параметра. Он определяет, сколько строк находится на листе. Он получает все значения в указанном столбце. Он просматривает значения от конца до начала, пока не найдет значение, которое не является пустой строкой. Наконец, он возвращает значение.
Сценарий:
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()
функциям ячеек и заставить их обновляться. Я просто не могу найти его в документации.
Аналогичный ответ на ответ Калигари , но мы можем привести его в порядок, просто указав полный диапазон столбцов:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
диапазоне ed, аналогично ответу @ Geta .
COUNT(G2:G)
возвращает 0. Вместо этого используйте, COUNTA(G2:G)
что подсчитывает только количество значений в наборе данных. COUNTA
полезен только в сочетании с INDEX
для получения последнего значения, если между вашими значениями нет ни одного пробела.
COUNTA
. COUNT
считает только числовые значения: он вернет 0 при задании, например, текстовых ячеек.
На самом деле я нашел здесь более простое решение:
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)))))
ROW
возвращает номер строки, поэтому FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
возвращает массив всех непустых номеров строк (не их значений), например [1,2, 3, 7, 12, 14]. Затем MAX
дает нам номер последней строки. FILTER
Затем применяется второй , чтобы отфильтровать все строки, в которых номер строки не соответствует значению MAX
(то есть значению последней непустой строки).
Функция LAST () в настоящий момент не реализована для выбора последней ячейки в диапазоне. Однако, следуя вашему примеру:
=LAST(G2:G9999)
мы можем получить последнюю ячейку, используя пару функций INDEX () и COUNT () следующим образом:
=INDEX(G2:G; COUNT(G2:G))
В таблице есть живой пример, где я нашел (и решил) ту же проблему (лист Orzamentos
, ячейка I5
). Обратите внимание, что он отлично работает даже со ссылкой на другие листы в документе.
COUNTA
в этом случае, если уверены, что между значениями в столбце нет ни одного пробела. Смотрите мои комментарии к ответу dohmoose.
:G
обозначает последний элемент? Это задокументировано?
=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) )
Чтобы вернуть последнее значение из столбца текстовых значений, вам нужно использовать COUNTA, поэтому вам понадобится эта формула:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
сочетании с INDEX
не будет возвращать последнее значение в столбце.
попробуй это:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Предположим, что столбец, в котором вы ищете последнее значение, - B.
И да, с пробелами работает.
Похоже, что скрипт 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: Как заставить формулы пересчитываться?
Я просмотрел предыдущие ответы, и мне показалось, что они слишком много работают. Возможно, поддержка сценариев просто улучшилась. Я думаю, что функция выражается так:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
Затем в своей таблице я использую:
= lastValue(E17:E999)
В этой функции я получаю массив значений, по одному на ячейку, на которую указывает ссылка, и это просто выполняет итерацию от конца массива в обратном направлении, пока не найдет непустое значение или не закончатся элементы. Ссылки на листы следует интерпретировать до передачи данных в функцию. Тоже недостаточно навороченный, чтобы справиться с многомерностью. Вопрос действительно касался последней ячейки в одном столбце, поэтому, похоже, он подходит. Он, вероятно, умрет, если у вас закончатся данные.
Ваш пробег может отличаться, но это работает для меня.
Это получает последнее значение и обрабатывает пустые значения:
=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()))) ) ) )
Ответ
$ =INDEX(G2:G; COUNT(G2:G))
некорректно работает в LibreOffice. Однако с небольшими изменениями работает отлично.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Он всегда работает, только если истинный диапазон меньше, чем (G2:G10000)
Допустимо ли отвечать на исходный вопрос строго не по теме :) Вы можете написать формулу в электронной таблице, чтобы сделать это. Возможно, некрасиво? но эффективен при нормальной работе с электронной таблицей.
=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.
Я играл с кодом, предоставленным @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)
Я нашел другой способ, может быть, он тебе поможет
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- вернет последнюю строку
Дополнительная информация из анаба здесь: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Я удивлен, что никто раньше не давал такого ответа. Но это должно быть самое короткое, и оно даже работает в 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)
Нахождение MAX
imum ROW
непустой строки и передача его вINDEX
В нулевом пустом массиве прерываний Другой вариант - использовать INDIRECT
RC
обозначение с COUNTBLANK
. Если V4: V6 занят записями, то,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
даст позицию V6.
Tools -> Scripts -> Script editor...