Вибір останнього значення стовпця


106

У мене є електронна таблиця з деякими значеннями в стовпці G. Деякі клітини порожні між ними, і мені потрібно отримати останнє значення з цього стовпця в іншу клітинку.

Щось на зразок:

=LAST(G2:G9999)

за винятком того, що LASTце не функція.

Відповіді:


54

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

Сценарій:

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()функції комірок і змусити їх оновлюватись. Я просто не можу знайти його в документації.


5
Це сценарій електронної таблиці Google. Ви можете створити новий сценарій підTools -> Scripts -> Script editor...
tinifni

1
: O це дивовижно! Я не знав, що Google реалізував сценарії. Дуже дякую, це спрацювало чудово
cambraca

1
будь-яка ідея, як змусити її автоматично оновлюватись, коли я змінюю дані на аркуші?
cambraca

Я відредагував свою відповідь деякою інформацією, яка повинна допомогти. Щасливого кодування!
tinifni

5
Я вніс редагування цього сценарію, щоб ви могли передавати в нього іменовані аркуші, як lastValue ("Sheet1! A") gist.github.com/2701061
johnwards

165

Аналогічна відповідь на відповідь caligari , але ми можемо виправити її, просто вказавши повний діапазон стовпців:

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

12
Схоже, це працює до тих пір, поки в наборі даних немає пробілів
Кіт Сірмонс

Ще одним хорошим ресурсом є обрана відповідь на productforums.google.com/forum/#!topic/docs/p3t3feg7Jic, яка показує, як отримати перший, останній чи n-й ряд у FILTER()діапазоні ed, подібний до відповіді @ Geta .
Аарон Бленкуш

Ця відповідь stackoverflow.com/a/8161172/418111 має формулу, яка підтримує клітинки пробілів.
Даніель

8
Як згадував @KeithSirmons. У вашому стовпці є пробіли, але це не працює, оскільки COUNT(G2:G)повертає 0. Замість цього використовуйте, COUNTA(G2:G)що враховує лише кількість значень у наборі даних. COUNTAкорисно в поєднанні з, INDEXщоб отримати останнє значення, якщо між вашими значеннями немає жодного порожнього.
Крістіан Вестербек

3
Також зверніть увагу, якщо ваші значення не є числовими, вам знадобиться COUNTA. COUNTпідраховує лише числові значення: воно буде повертати 0, якщо задано, наприклад, текстові комірки.
Повітря

53

Насправді я знайшов більш просте рішення тут:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=uk

Це виглядає приблизно так:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))

2
Нічого це неймовірно чисто. Чи можете ви пояснити, як саме це працює?
cambraca

Не насправді: це правильно саме тоді, коли діапазон джерела вже відсортований.
caligari

5
Пояснено: ROWповертає номер рядка, тому FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )повертає масив усіх непорожніх номерів рядків (не їх значень), наприклад [1,2, 3, 7, 12, 14]. Потім MAXнадає нам номер останнього рядка. FILTERПотім застосовується друга , щоб відфільтрувати всі рядки, де номер рядка не відповідає значенню MAX(тобто значення останнього непорожнього рядка).
jhabbott

Обидва екземпляри ROW можуть бути замінені на COLUMN, щоб повернути останнє значення у певному рядку (замість останнього значення у певному стовпчику).
Джон Шнайдер

2
Що робити, якщо я просто хотів номер рядка останнього значення стовпця?
Nick5a1

44

Наразі функція LAST () не реалізована для вибору останньої комірки в межах діапазону. Однак, наслідуючи ваш приклад:

=LAST(G2:G9999)

ми можемо отримати останню комірку, використовуючи пару функцій INDEX () та COUNT () таким чином:

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

На електронній таблиці є живий приклад, де я знайшов (і вирішив) ту саму проблему (аркуш Orzamentos, комірка I5). Зауважте, що він чудово працює навіть на інших аркушах документа.


1
Це чудово працює і автоматично оновлюється в міру зміни аркуша. Дякую!
TinaMarie

8
Мені подобається стислість цієї пропозиції, але це, здається, не працює, коли цільовий діапазон включає деякі порожні комірки (як зазначено в першому запитанні вище), оскільки COUNT () не рахує порожніх комірок.
Джон Шнайдер

@JonSchneider ви можете використовувати COUNTAв цьому випадку, якщо ви впевнені, що між значеннями в стовпчику немає жодного порожнього. Дивіться мої коментарі до відповіді dohmoose.
Крістіан Вестербек

Чому :Gпозначають останній елемент? Це документально підтверджено?
flow2k

33

Підсумок:

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

Супер корисно проходити кроки та функціональність + обмеження кожної ітерації. Мені потрібно було отримати останнє значення в кожному рядку, деякі з кількома пробілами. Це спрацювало як шарм. Дякую!
Крістіан Адамс

9

Щоб повернути останнє значення зі стовпця текстових значень, вам потрібно використовувати COUNTA, тож вам знадобиться ця формула:

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

1
Але лише в тому випадку, якщо між вашими значеннями немає жодної порожньої. Якщо є, у COUNTAпоєднанні з INDEXне поверне останнє значення у стовпці.
Крістіан Вестербек

7

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

Припустимо, стовпець, у якому ви шукаєте останнє значення, - B.

І так, це працює з заготовками.


6

Схоже, сценарій 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: Як змусити формули робити перерахунок?


6

Я переглянув попередні відповіді, і, здається, вони занадто наполегливо працюють. Можливо, підтримка сценаріїв просто покращилася. Я думаю, що функція виражається так:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

У своїй таблиці я використовую:

= lastValue(E17:E999)

У функції я отримую масив значень з одиницею на кожну осередку, і це просто повторюється з кінця масиву назад, поки не знайде не порожнє значення або не закінчиться елементів. Посилання на аркуші повинні інтерпретуватися до передачі даних у функцію. Також не досить фантазії для обробки багатовимірних параметрів. Питання запитувало останню клітинку в одному стовпчику, тому, здається, вона відповідає. Це, ймовірно, загине, якщо у вас також не вистачить даних.

Ваш пробіг може відрізнятися, але це працює для мене.


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

відсутність жорсткого кодування.


5

Цей для мене працює:

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

Приємне рішення, яке працює і при наявності порожніх комірок.
червня

5

Це отримує останнє значення і обробляє порожні значення:

=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()))) ) ) )
Язон

Для мене це "правильна" відповідь. Розумно компактний і легкий для розуміння та працює з заготовками.
aardvarkk

4

У стовпці з пробілами ви можете отримати останнє значення за допомогою

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

Приємне рішення. Я підозрюю, що варіант @ Педро (використовуючи INDEX та MAX) може бути дещо ефективнішим, ніж використання SORT.
червня

4

Відповідь

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

не працює належним чином у LibreOffice. Однак при невеликій зміні він працює чудово.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

Він завжди працює лише в тому випадку, якщо справжній діапазон менший, ніж (G2:G10000)


Ця публікація була позначена як "Електронна таблиця Google" та "Сценарій Google Apps", нічого, що стосується
вільного

Не дуже страшна тема, як заголовок питання, Вибираючи останнє значення стовпця , легко знайде бідна душа за допомогою LibreOffice або Numbers. Я любитель електронних таблиць, який знає достатньо, щоб бути небезпечним. Що я можу зібрати, це те, що Google зробив це так, що якщо ваш другий аргумент діапазону - це лише стовпець, він вибере решту стовпця, щоб людям не довелося використовувати дуже велику кількість хак, які ви виявили.
Аарон

3

Чи прийнятно відповісти на оригінальне запитання із суворо відповідальною темою :) Ви можете написати формулу в таблицю для цього. Некрасиво, можливо? але ефективний при нормальній роботі електронної таблиці.

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


3
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());

3

Я грав із кодом, наданим @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)

2

Щодо коментаря @ Jon_Schneider, якщо стовпець має порожні клітинки, просто використовуйте COUNTA ()

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

4
Ні, і це не працює. Різниця між COUNT та COUNTA полягає у відмінні між цифрами та текстом, що тут не має значення.
mhsmith

2

Я знайшов інший спосіб, можливо, це допоможе вам

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) -повернемо останній ряд

Більше інформації від anab тут: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI


1
Не насправді: це правильно саме тоді, коли діапазон джерела вже відсортований.
Калігарі

2

Знайдено незначну варіацію, яка працювала над усуненням заготовок із нижньої частини таблиці. = індекс (G2: G, COUNTIF (G2: G, "<>"))


1

Я здивований, що раніше ніхто не давав такої відповіді. Але це має бути найкоротшим, і він працює навіть у відмінній формі:

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

Знаходження MAXIMUM ROWз непорожній рядки і подачі їїINDEX

У нульовому порожньому масиві переривань використання INDIRECT RCNotation with COUNTBLANK є ще одним варіантом. Якщо V4: V6 зайнятий записами, то,

V18 :

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

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


1

щоб отримати останнє значення з стовпця, ви також можете використовувати MAXфункцію з IFфункцією

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.