21 ответов:
так это решение принимает строку в качестве параметра. Он находит, сколько строк в листе. Он получает все значения в указанном столбце. Он перебирает значения от конца к началу, пока не найдет значение, которое не является пустой строкой. Наконец, он возвращает значение.
сценарий:
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()и сила в функции ячейки для обновления. Я просто не могу найти его в документации.
подобный ответ Калигари, но мы можем привести его в порядок, просто указав полный диапазон столбцов:
=INDEX(G2:G, COUNT(G2:G))
на самом деле я нашел более простое решение здесь:
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)))))
функция LAST () в данный момент не реализована для выбора последней ячейки в пределах диапазона. Однако, следуя вашему примеру:
=LAST(G2:G9999)мы можем получить последнюю ячейку, используя пару функций INDEX () и COUNT () таким образом:
=INDEX(G2:G; COUNT(G2:G))есть видео в spreedsheet, где я нашел (и решил) ту же проблему (лист
Orzamentos, cellI5). Обратите внимание, что это прекрасно работает даже со ссылкой на другие листы в документе.
резюме:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )детали:
я просмотрел и попробовал несколько ответов, и вот что я нашел: Самое простое решение (см. Dohmoose') работает, если нет заготовок:
=INDEX(G2:G; COUNT(G2:G))если у вас есть пробелы, это не удается.
вы можете обрабатывать один пробел, просто изменив с
COUNTдоCOUNTA(см. user3280071 это!--22-->):=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))
попробуйте это:
=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 help forum:как заставить формулы для пересчета?
Я посмотрел на предыдущие ответы, и они кажутся, что они работают слишком много. Возможно, поддержка сценариев просто улучшилась. Я думаю, что функция выражается так:
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)) ) ) )
function lastRow(column){ var sheet = SpreadsheetApp.getActiveSpreadsheet(); var lastRow = sheet.getLastRow(); var lastRowRange=sheet.getRange(column+startRow); return lastRowRange.getValue(); }нет жесткого кодирования.
ответ
$ =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.
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());
Я играл с кодом, заданным @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)
Что касается комментария @Jon_Schneider, если столбец имеет пустые ячейки, просто используйте COUNTA ()
=INDEX(G2:G; COUNT**A**(G2:G))
я удивлен, что никто никогда не дал этот ответ до. Но это должно быть самым коротким, и он даже работает в 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)Поиск элемент
MAXimumROWне пустой строки и подачи его вINDEXв нулевом пустом массиве прерываний, используя
INDIRECTRCнотации сCOUNTBLANKэто еще один вариант. Если V4: V6 занят записями, то,V18:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)даст положение V6.
Я нашел другой способ, может быть он поможет вам
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )-вернет последнюю строкудополнительная информация от anab здесь: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
найдено небольшое изменение, которое работало для устранения пробелов из нижней части таблицы. =индекс (G2:G, COUNTIF(G2: G,""))
Comments