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



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



что-то типа:



=LAST(G2:G9999)


кроме этого LAST Не функция.

455   21  

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, cell I5). Обратите внимание, что это прекрасно работает даже со ссылкой на другие листы в документе.

резюме:

=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(I:I;MAX((I:I<>"")*(ROW(I:I))))

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

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

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

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

Поиск элемент MAX imum ROW не пустой строки и подачи его в 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

    Ничего не найдено.