Вопрос

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

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

=LAST(G2:G9999)

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

Это было полезно?

Решение

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

Сценарий:

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

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

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(G2:G9999)

Мы можем получить последнюю ячейку, используя пару функций ПОКАЗАТЕЛЬ() и СЧИТАТЬ() таким образом:

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

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

Резюме:

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

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

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

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

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

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

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

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

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

Похоже, что скрипт Apps Google теперь поддерживает диапазоны как параметры функции. Это решение принимает диапазон:

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

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

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

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

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

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

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

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

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

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

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

Ответ

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

Я нашел другой путь, возможно, это поможет вам

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) - Возвращение последней строки

Больше информации от Anab здесь:https://groups.google.com/forum/?fromgroups=#!Topic/how-to-documents/if0_fgvinmi.

Нашел небольшое изменение, которое работало, чтобы устранить пробелы со дна таблицы. = индекс (G2: G, COCTIF (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имум ROW не пустой ряд и кормить его INDEX

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

V18.:

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

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

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

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top