Получить последнюю непустую ячейку в столбце в Google Sheets - PullRequest
100 голосов
/ 14 ноября 2011

Я использую следующую функцию

=DAYS360(A2, A35)

, чтобы вычислить разницу между двумя датами в моем столбце.Однако столбец постоянно расширяется, и в настоящее время мне приходится вручную менять «A35» при обновлении электронной таблицы.

Есть ли способ (в Google Sheets) найти последнюю непустую ячейку в этом столбце изатем динамически установить этот параметр в вышеуказанной функции?

Ответы [ 12 ]

126 голосов
/ 17 ноября 2011

Может быть, есть более красноречивый способ, но я придумал вот так:

Функция поиска последней заполненной ячейки в столбце:

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

Так что, если вы объедините его с текущей функцией, это будет выглядеть так:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))
66 голосов
/ 09 сентября 2014

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

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

Я думаю, что это немного быстрее и проще.

43 голосов
/ 26 марта 2016

Если A2: A содержит даты непрерывно, то INDEX (A2: A, COUNT (A2: A)) вернет последнюю дату. Окончательная формула

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
23 голосов
/ 31 марта 2017

Мой любимый это:

=INDEX(A2:A,COUNTA(A2:A),1)

Итак, для ОП необходимо:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
15 голосов
/ 02 августа 2016

Если столбец расширен только на непрерывно добавленные даты как в моем случае - я использовал только функцию MAX, чтобы получить последнюю дату.

Окончательная формула будет:

=DAYS360(A2; MAX(A2:A)) 
10 голосов
/ 25 января 2017

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

Use just the column name to denote last non-empty row of that column.

Например:

Если ваши данные в A1:A100 и вы хотите бытьвозможность добавить дополнительные данные в столбец A, скажем, это может быть A1:A105 или даже A1:A1234 позже, вы можете использовать этот диапазон:

A1:A
6 голосов
/ 22 апреля 2015

Как насчет этой формулы для получения последнего значения:

=index(G:G;max((G:G<>"")*row(G:G)))

И это будет окончательная формула для вашего исходного задания:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

Предположим, что ваша начальная дата находится вG10.

4 голосов
/ 12 января 2018

Вот еще один:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))

С последним уравнением:

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))

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

=max(arrayformula(if(A:A<>"",row(A:A),"")))

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

Кроме того, это дает дополнительное преимущество, заключающееся в том, что он работает с любыми типами данных в любом порядке, и вы можете иметь пустые строки между строками с содержимым, а также не считать ячейки с формулами, которые оцениваются как "". Он также может обрабатывать повторяющиеся значения. В целом, это очень похоже на уравнение, которое использует max ((G: G <> "") * row (G: G)), но облегчает вытаскивание номера строки, если вы хотите .

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

function lastRow(sheet,column) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (column == null) {
    if (sheet != null) {
       var sheet = ss.getSheetByName(sheet);
    } else {
      var sheet = ss.getActiveSheet();
    }
    return sheet.getLastRow();
  } else {
    var sheet = ss.getSheetByName(sheet);
    var lastRow = sheet.getLastRow();
    var array = sheet.getRange(column + 1 + ':' + column + lastRow).getValues();
    for (i=0;i<array.length;i++) {
      if (array[i] != '') {       
        var final = i + 1;
      }
    }
    if (final != null) {
      return final;
    } else {
      return 0;
    }
  }
}

Здесь вы можете просто ввести следующее, если вы хотите, чтобы последняя строка на том же листе, который вы редактируете в данный момент:

=LASTROW()

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

=LASTROW("Sheet1","A")

А для последнего ряда конкретного листа в целом:

=LASTROW("Sheet1")

Затем, чтобы получить фактические данные, вы можете использовать косвенные:

=INDIRECT("A"&LASTROW())

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

return sheet.getRange(column + final).getValue();

и

return sheet.getRange(column + lastRow).getValue();

Одним из преимуществ этого сценария является то, что вы можете выбрать, хотите ли вы включить уравнения, которые оцениваются как "". Если никакие аргументы не добавлены, уравнения, оценивающие "", будут подсчитаны, но если вы укажете лист и столбец, они теперь будут подсчитаны. Кроме того, есть большая гибкость, если вы хотите использовать варианты сценария.

Вероятно, излишнее, но все возможно.

2 голосов
/ 23 января 2019

Я пошел другим путем. Поскольку я знаю, что буду добавлять что-то в строку / столбец один за другим, я узнаю последнюю строку, сначала посчитав поля, в которых есть данные. Я продемонстрирую это с помощью столбца:

=COUNT(A5:A34)

Итак, допустим, что вернулось 21. A5 на 4 строки вниз, поэтому мне нужно получить 21-ю позицию от 4-й строки вниз. Я могу сделать это, используя неопределенный, вот так:

=INDIRECT("A"&COUNT(A5:A34)+4)

Он находит количество строк с данными и возвращает мне число, которое я использую в качестве модификатора индекса.

0 голосов
/ 13 июля 2019

за ряд:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

для столбца:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...