Chọn giá trị cuối cùng của một cột


Câu trả lời:


54

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.


5
Đây là một tập lệnh Bảng tính Google. Bạn có thể tạo một kịch bản mới dướiTools -> Scripts -> Script editor...
tinifni

1
: O điều đó thật tuyệt vời! Tôi không biết Google đã triển khai các tập lệnh. Cảm ơn bạn rất nhiều, nó hoạt động hoàn hảo
cambraca

1
bất kỳ ý tưởng nào về cách làm cho nó cập nhật tự động khi tôi thay đổi dữ liệu trong trang tính?
cambraca

Tôi đã chỉnh sửa câu trả lời của mình với một số thông tin hữu ích. Chúc bạn viết mã vui vẻ!
tinifni

5
Tôi đã thực hiện một chỉnh sửa kịch bản này, do đó bạn có thể đi vào tên tờ vào nó như lastValue ( "Sheet1 A!") Gist.github.com/2701061
johnwards

165

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

12
Điều này dường như hoạt động miễn là không có khoảng trống trong tập dữ liệu
Keith Sirmons

Một tài nguyên hữu ích khác là câu trả lời được chọn tại productforums.google.com/forum/#!topic/docs/p3t3feg7Jic , cho biết cách lấy hàng đầu tiên, cuối cùng hoặc thứ n trong một FILTER()phạm vi ed, tương tự như câu trả lời của @ Geta .
Aaron Blenkush

Câu trả lời này stackoverflow.com/a/8161172/418111 có công thức hỗ trợ các ô trống.
Daniel

8
Như @KeithSirmons đã đề cập. Có khoảng trống trong cột của bạn, nó không hoạt động, vì 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. COUNTAchỉ 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.
Christiaan Westerbeek

3
Cũng lưu ý nếu các giá trị của bạn không phải là số, bạn sẽ cần COUNTA. COUNTchỉ đế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.
Air

53

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

2
Wow cái này sạch kinh khủng. Bạn có thể giải thích chính xác nó hoạt động như thế nào không?
cambraca

Không hẳn: nó đúng khi phạm vi nguồn đã được sắp xếp.
caligari

5
Giải thích: ROWtrả 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 đó, MAXcung 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).
jhabbott

Cả hai trường hợp ROW đều có thể được thay thế bằng COLUMN để trả về giá trị cuối cùng trong một hàng cụ thể (thay vì giá trị cuối cùng trong một cột cụ thể).
Jon Schneider

2
Điều gì sẽ xảy ra nếu tôi chỉ muốn số hàng của giá trị cuối cùng của cột?
Nick5a1

44

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


1
Điều này hoạt động tốt và tự động cập nhật khi trang tính thay đổi. Cảm ơn!
TinaMarie

8
Tôi thích tính ngắn gọn của đề xuất này, nhưng nó có vẻ không hoạt động khi phạm vi mục tiêu bao gồm một số ô trống (như đã đề cập trong câu hỏi ban đầu ở trên), vì COUNT () không tính các ô trống.
Jon Schneider

@JonSchneider bạn có thể sử dụng COUNTAtrong 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.
Christiaan Westerbeek

Tại sao :Gbiểu thị phần tử cuối cùng? Đây có phải là tài liệu?
flow2k

33

Tóm lược:

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

Chi tiết:

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ừ COUNTthà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 1không thành công cho tôi.)

Đoạn mã sau hoạt động (Xem câu trả lời của Nadernhậ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 COLUMNShoặc ROWScho một phạm vi nhất định.

Tuy nhiên, nếu COLUMNSđược thay thế bằng COUNTTô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ì COUNTAbộ 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) )

Rất hữu ích để xem qua các bước và chức năng + hạn chế của mỗi lần lặp. Tôi cần lấy giá trị cuối cùng trong mỗi hàng, một số có nhiều ô trống. Điều này làm việc như một sự quyến rũ. Cảm ơn bạn!
Christiaan Adams

9

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

1
Nhưng chỉ khi không có một ô trống nào giữa các giá trị của bạn. Nếu có, COUNTAkết hợp với INDEXsẽ không trả về giá trị cuối cùng trong cột.
Christiaan Westerbeek

7

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.


6

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?


6

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.


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

không có mã hóa cứng.


5

Cái này phù hợp với tôi:

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

Một giải pháp hay, cũng hoạt động khi có các ô trống.
jochen

5

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

cũng hoạt động cho các cột. Tôi chỉ thay thế một số thứ. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason

giải pháp chung:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason

Đối với tôi, đây là câu trả lời "đúng". Cô đọng hợp lý và dễ hiểu, và hoạt động với các khoảng trống.
aardvarkk

4

Trong cột có ô trống, bạn có thể nhận giá trị cuối cùng với

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

Một giải pháp tốt. Tuy nhiên, tôi nghi ngờ biến thể của @ Pedro (sử dụng INDEX và MAX) có thể hiệu quả hơn một chút so với sử dụng SORT.
jochen

4

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)


Bài đăng này đã được gắn thẻ "Google Spreadsheet" và "Google Apps Script", không có gì liên quan đến Libre Office ... bạn đang lạc đề
Serge insas

Không quá xa rời chủ đề như tiêu đề của câu hỏi, Chọn giá trị cuối cùng của một cột , có thể dễ dàng tìm thấy bởi một số người nghèo bằng cách sử dụng LibreOffice hoặc Numbers. Tôi là một tay máy tính nghiệp dư, người biết đủ nguy hiểm. Những gì tôi có thể thu thập được là Google đã tạo ra nó để nếu đối số thứ hai của bạn cho một phạm vi chỉ là một cột, nó sẽ chọn phần còn lại của cột để mọi người không phải sử dụng cách hack số lượng rất lớn mà bạn đã phát hiện.
Aaron

3

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.


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

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)

2

Về nhận xét của @ Jon_Schneider, nếu cột có các ô trống, chỉ cần sử dụng COUNTA ()

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

4
Không, điều đó cũng không hoạt động. Sự khác biệt giữa COUNT và COUNTA nằm ở sự phân biệt giữa số và văn bản, điều này không liên quan ở đây.
mhsmith


2

Đã tìm thấy một biến thể nhỏ có tác dụng loại bỏ khoảng trống ở cuối bảng. = index (G2: G, COUNTIF (G2: G, "<>"))


1

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ì LOOKUPkhông có cách tiếp cận từ trên xuống để tìm 2và 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 MAXimum ROWcủ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 RCký 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.


1

để lấy giá trị cuối cùng từ một cột, bạn cũng có thể sử dụng MAXhàm với IFhàm

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.