Câu trả lời:
Vì vậy, giải pháp này nhận một chuỗi làm tham số của nó. Nó tìm thấy có bao nhiêu hàng trong trang tính. Nó nhận tất cả các giá trị trong cột được chỉ định. Nó lặp qua các giá trị từ cuối đến đầu cho đến khi nó tìm thấy một giá trị không phải là một chuỗi rỗng. Cuối cùng nó chạy lại giá trị.
Kịch bản:
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];
}
Sử dụng:
=lastValue("G")
BIÊN TẬP:
Để trả lời bình luận yêu cầu chức năng tự động cập nhật:
Cách tốt nhất tôi có thể tìm là sử dụng điều này với đoạn mã trên:
function onEdit(event) {
SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
Nó sẽ không còn được yêu cầu sử dụng hàm trong một ô như trạng thái của phần Sử dụng . Thay vào đó, bạn phải cố gắng mã hóa ô bạn muốn cập nhật và cột bạn muốn theo dõi. Có thể có một cách hùng hồn hơn để thực hiện điều này (hy vọng một cách không được mã hóa cứng), nhưng đây là cách tốt nhất tôi có thể tìm thấy cho đến bây giờ.
Lưu ý rằng nếu bạn sử dụng hàm trong ô như đã nêu trước đó, nó sẽ cập nhật khi tải lại. Có thể có một cách để móc vào onEdit()
và buộc các hàm ô phải cập nhật. Tôi chỉ không thể tìm thấy nó trong tài liệu.
Câu trả lời tương tự như câu trả lời của caligari , nhưng chúng ta có thể thu gọn nó bằng cách chỉ định toàn bộ phạm vi cột:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
phạm vi ed, tương tự như câu trả lời của @ Geta .
COUNT(G2:G)
trả về 0. Thay vào đó, hãy sử dụng COUNTA(G2:G)
chỉ đếm số giá trị trong tập dữ liệu. COUNTA
chỉ hữu ích khi kết hợp với INDEX
để nhận giá trị cuối cùng nếu không có một ô trống nào giữa các giá trị của bạn.
COUNTA
. COUNT
chỉ đếm các giá trị số: nó sẽ trả về 0 khi được cung cấp, ví dụ như các ô văn bản.
Trên thực tế, tôi đã tìm thấy một giải pháp đơn giản hơn ở đây:
http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=vi
Nó trông như thế này:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
ROW
trả về số hàng, do đó FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
trả về một mảng gồm tất cả các số hàng không trống (không phải giá trị của chúng), ví dụ [1,2, 3, 7, 12, 14]. Sau đó, MAX
cung cấp cho chúng tôi số hàng cuối cùng. Sau đó, giây thứ hai FILTER
được áp dụng để lọc ra tất cả các hàng mà số hàng không khớp với giá trị từ đó MAX
(tức là giá trị của hàng không trống cuối cùng).
Hiện tại, hàm LAST () không được triển khai để chọn ô cuối cùng trong một phạm vi. Tuy nhiên, theo ví dụ của bạn:
=LAST(G2:G9999)
chúng tôi có thể lấy ô cuối cùng bằng cách sử dụng một vài hàm INDEX () và COUNT () theo cách này:
=INDEX(G2:G; COUNT(G2:G))
Có một ví dụ trực tiếp tại spreedsheet mà tôi đã tìm thấy (và giải quyết) cùng một vấn đề (trang tính Orzamentos
, ô I5
). Lưu ý rằng nó hoạt động hoàn hảo ngay cả khi tham chiếu đến các trang tính khác trong tài liệu.
COUNTA
trong trường hợp đó nếu bạn chắc chắn không có một ô trống nào giữa các giá trị trong cột. Xem bình luận của tôi để trả lời dohmoose.
:G
biểu thị phần tử cuối cùng? Đây có phải là tài liệu?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Tôi đã xem qua và thử một số câu trả lời, và đây là những gì tôi tìm thấy: Giải pháp đơn giản nhất (xem câu trả lời của Dohmoose ) hoạt động nếu không có ô trống:
=INDEX(G2:G; COUNT(G2:G))
Nếu bạn có khoảng trống, nó không thành công.
Bạn có thể xử lý một ô trống bằng cách thay đổi từ COUNT
thành COUNTA
(Xem câu trả lời của user3280071 ):
=INDEX(G2:G; COUNTA(G2:G))
Tuy nhiên, điều này sẽ không thành công đối với một số tổ hợp ô trống. ( 1 blank 1 blank 1
không thành công cho tôi.)
Đoạn mã sau hoạt động (Xem câu trả lời của Nader và nhận xét của jason ):
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
nhưng nó yêu cầu suy nghĩ về việc bạn muốn sử dụng COLUMNS
hoặc ROWS
cho một phạm vi nhất định.
Tuy nhiên, nếu COLUMNS
được thay thế bằng COUNT
Tôi dường như nhận được một triển khai chống trống đáng tin cậy của LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Và vì COUNTA
bộ lọc được tích hợp sẵn, chúng tôi có thể đơn giản hóa hơn nữa việc sử dụng
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Điều này hơi đơn giản và chính xác. Và bạn không phải lo lắng về việc đếm hàng hay cột. Và không giống như các giải pháp tập lệnh, nó tự động cập nhật với các thay đổi đối với bảng tính.
Và nếu bạn muốn nhận giá trị cuối cùng trong một hàng, chỉ cần thay đổi phạm vi dữ liệu:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Để trả về giá trị cuối cùng từ một cột giá trị văn bản, bạn cần sử dụng COUNTA, vì vậy bạn sẽ cần công thức này:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
kết hợp với INDEX
sẽ không trả về giá trị cuối cùng trong cột.
thử cái này:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Giả sử cột mà bạn đang tìm giá trị cuối cùng là B.
Và có, nó hoạt động với khoảng trống.
Có vẻ như Google Apps Script hiện hỗ trợ phạm vi dưới dạng tham số chức năng. Giải pháp này chấp nhận một phạm vi:
// 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;
}
Đồng thời xem thảo luận trong diễn đàn trợ giúp Google Apps Script: Làm cách nào để buộc các công thức phải tính toán lại?
Tôi đã xem các câu trả lời trước đó và có vẻ như họ đang làm việc quá chăm chỉ. Có thể đơn giản là hỗ trợ tập lệnh đã được cải thiện. Tôi nghĩ rằng hàm được thể hiện như thế này:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
Trong bảng tính của mình, tôi sử dụng:
= lastValue(E17:E999)
Trong hàm, tôi nhận được một mảng giá trị với một giá trị trên mỗi ô được tham chiếu và điều này chỉ lặp lại từ cuối mảng trở về trước cho đến khi nó tìm thấy giá trị không trống hoặc hết phần tử. Các tham chiếu trang tính phải được diễn giải trước khi dữ liệu được chuyển đến hàm. Cũng không đủ ưa thích để xử lý nhiều chiều. Câu hỏi đã yêu cầu ô cuối cùng trong một cột duy nhất, vì vậy nó có vẻ phù hợp. Nó có thể sẽ chết nếu bạn hết dữ liệu.
Số dặm của bạn có thể khác nhau, nhưng điều này phù hợp với tôi.
Điều này nhận giá trị cuối cùng và xử lý các giá trị trống:
=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()))) ) ) )
Câu trả lời
$ =INDEX(G2:G; COUNT(G2:G))
không hoạt động chính xác trong LibreOffice. Tuy nhiên, với một thay đổi nhỏ, nó hoạt động hoàn hảo.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Nó luôn chỉ hoạt động nếu phạm vi thực nhỏ hơn (G2:G10000)
Có thể chấp nhận câu trả lời ban đầu bằng một câu trả lời lạc đề hay không :) Bạn có thể viết một công thức trong bảng tính để thực hiện việc này. Có lẽ xấu? nhưng hiệu quả trong hoạt động bình thường của bảng tính.
=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
Điều này được đưa ra như một ý tưởng cho một loạt các câu hỏi trong lĩnh vực tập lệnh có thể được cung cấp một cách đáng tin cậy với các công thức mảng có lợi thế là thường hoạt động theo kiểu tương tự trong excel và openoffice.
Tôi đang chơi với mã do @tinfini đưa ra và nghĩ rằng mọi người có thể hưởng lợi từ những gì tôi nghĩ là một giải pháp thanh lịch hơn một chút (lưu ý rằng tôi không nghĩ rằng các tập lệnh hoạt động hoàn toàn giống như khi anh ấy tạo ra câu trả lời ban đầu) ...
//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]);
}
Khi sử dụng, nó sẽ giống như sau:
=LastInRange(D2:D)
Tôi đã tìm thấy một cách khác có thể nó sẽ giúp bạn
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-sẽ trả lại hàng cuối cùng
Thông tin thêm từ anab tại đây: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Tôi ngạc nhiên là chưa có ai đưa ra câu trả lời này trước đây. Nhưng điều này phải là ngắn nhất và nó thậm chí hoạt động trong excel:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
tạo một mảng 1 / true (1) và 1 / false (0). Vì LOOKUP
không có cách tiếp cận từ trên xuống để tìm 2
và Vì nó sẽ không bao giờ tìm thấy 2, nó đi đến hàng không trống cuối cùng và đưa ra vị trí của hàng đó.
Cách khác để làm điều này, như những người khác có thể đã đề cập, là:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Tìm MAX
imum ROW
của hàng không trống và đưa nó vàoINDEX
Trong một mảng gián đoạn trống không, Sử dụng INDIRECT
RC
ký hiệu với COUNTBLANK
là một tùy chọn khác. Nếu V4: V6 có các mục nhập, thì,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
sẽ cho vị trí của V6.
để lấy giá trị cuối cùng từ một cột, bạn cũng có thể sử dụng MAX
hàm với IF
hàm
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Tools -> Scripts -> Script editor...