Відповіді:
Тож це рішення приймає рядок як свій параметр. Він знаходить, скільки рядків у аркуша. Він отримує всі значення у вказаному стовпці. Він перебирає значення від кінця до початку, поки не знайде значення, яке не є порожнім рядком. Нарешті це повертає значення.
Сценарій:
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()
функції комірок і змусити їх оновлюватись. Я просто не можу знайти його в документації.
Аналогічна відповідь на відповідь caligari , але ми можемо виправити її, просто вказавши повний діапазон стовпців:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
діапазоні ed, подібний до відповіді @ Geta .
COUNT(G2:G)
повертає 0. Замість цього використовуйте, COUNTA(G2:G)
що враховує лише кількість значень у наборі даних. COUNTA
корисно в поєднанні з, INDEX
щоб отримати останнє значення, якщо між вашими значеннями немає жодного порожнього.
COUNTA
. COUNT
підраховує лише числові значення: воно буде повертати 0, якщо задано, наприклад, текстові комірки.
Насправді я знайшов більш просте рішення тут:
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)))))
ROW
повертає номер рядка, тому FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
повертає масив усіх непорожніх номерів рядків (не їх значень), наприклад [1,2, 3, 7, 12, 14]. Потім MAX
надає нам номер останнього рядка. FILTER
Потім застосовується друга , щоб відфільтрувати всі рядки, де номер рядка не відповідає значенню MAX
(тобто значення останнього непорожнього рядка).
Наразі функція LAST () не реалізована для вибору останньої комірки в межах діапазону. Однак, наслідуючи ваш приклад:
=LAST(G2:G9999)
ми можемо отримати останню комірку, використовуючи пару функцій INDEX () та COUNT () таким чином:
=INDEX(G2:G; COUNT(G2:G))
На електронній таблиці є живий приклад, де я знайшов (і вирішив) ту саму проблему (аркуш Orzamentos
, комірка I5
). Зауважте, що він чудово працює навіть на інших аркушах документа.
COUNTA
в цьому випадку, якщо ви впевнені, що між значеннями в стовпчику немає жодного порожнього. Дивіться мої коментарі до відповіді dohmoose.
:G
позначають останній елемент? Це документально підтверджено?
=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) )
Щоб повернути останнє значення зі стовпця текстових значень, вам потрібно використовувати COUNTA, тож вам знадобиться ця формула:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
поєднанні з INDEX
не поверне останнє значення у стовпці.
спробуйте це:
=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: Як змусити формули робити перерахунок?
Я переглянув попередні відповіді, і, здається, вони занадто наполегливо працюють. Можливо, підтримка сценаріїв просто покращилася. Я думаю, що функція виражається так:
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)) ) ) )
=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()))) ) ) )
Відповідь
$ =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.
Я грав із кодом, наданим @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)
Я знайшов інший спосіб, можливо, це допоможе вам
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-повернемо останній ряд
Більше інформації від anab тут: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Я здивований, що раніше ніхто не давав такої відповіді. Але це має бути найкоротшим, і він працює навіть у відмінній формі:
=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
У нульовому порожньому масиві переривань використання INDIRECT
RC
Notation with COUNTBLANK
є ще одним варіантом. Якщо V4: V6 зайнятий записами, то,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
дасть позицію V6.
Tools -> Scripts -> Script editor...