Memilih nilai terakhir kolom

Jawaban:

54

Jadi solusi ini mengambil string sebagai parameternya. Ini menemukan berapa banyak baris di lembar. Itu mendapatkan semua nilai di kolom yang ditentukan. Ini mengulang nilai-nilai dari akhir ke awal sampai menemukan nilai yang bukan string kosong. Akhirnya nilainya kembali.

Naskah:

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];
}

Pemakaian:

=lastValue("G")

EDIT:

Menanggapi komentar yang meminta fungsi untuk memperbarui secara otomatis:

Cara terbaik yang bisa saya temukan adalah menggunakan ini dengan kode di atas:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

Tidak lagi diperlukan untuk menggunakan fungsi dalam sel seperti status bagian Penggunaan . Alih-alih Anda melakukan hard coding pada sel yang ingin Anda perbarui dan kolom yang ingin Anda lacak. Ada kemungkinan bahwa ada cara yang lebih fasih untuk menerapkan ini (mudah-mudahan salah satu yang tidak memiliki kode keras), tetapi ini adalah yang terbaik yang dapat saya temukan untuk saat ini.

Perhatikan bahwa jika Anda menggunakan fungsi dalam sel seperti yang dinyatakan sebelumnya, itu akan diperbarui saat dimuat ulang. Mungkin ada cara untuk menghubungkan onEdit()dan memaksa fungsi sel untuk memperbarui. Saya tidak bisa menemukannya di dokumentasi.

tinifni
sumber
5
Ini adalah skrip Google Spreadsheet. Anda dapat membuat skrip baru di bawahTools -> Scripts -> Script editor...
tinifni
1
: O itu luar biasa! Saya tidak tahu Google telah menerapkan skrip. Terima kasih banyak, ini bekerja dengan sempurna
cambraca
1
ada ide bagaimana membuatnya diperbarui secara otomatis ketika saya mengubah data di lembar?
kambraka
Saya mengedit jawaban saya dengan beberapa informasi yang seharusnya membantu. Selamat membuat kode!
tinifni
5
Saya telah mengedit skrip ini sehingga Anda dapat meneruskan lembar bernama ke dalamnya seperti lastValue ("Sheet1! A") gist.github.com/2701061
johnwards
165

Jawaban serupa untuk jawaban caligari , tetapi kita dapat merapikannya hanya dengan menentukan rentang kolom lengkap:

=INDEX(G2:G, COUNT(G2:G))
dohmoose
sumber
12
Ini tampaknya berfungsi selama tidak ada yang kosong dalam kumpulan data
Keith Sirmons
Sumber daya bagus lainnya adalah jawaban yang dipilih di productforums.google.com/forum/#!topic/docs/p3t3feg7Jic yang menunjukkan cara mendapatkan baris pertama, terakhir, atau n dalam FILTER()rentang ed, mirip dengan jawaban @ Geta .
Aaron Blenkush
Jawaban stackoverflow.com/a/8161172/418111 ini memiliki rumus yang mendukung sel kosong.
Daniel
8
Seperti yang disebutkan oleh @Ke. Jika ada yang kosong di kolom Anda, itu tidak berfungsi, karena COUNT(G2:G)mengembalikan 0. Sebaliknya gunakan COUNTA(G2:G)itu hanya menghitung jumlah nilai dalam kumpulan data. COUNTAhanya berguna jika dikombinasikan dengan INDEXuntuk mendapatkan nilai terakhir jika tidak ada satu pun yang kosong di antara nilai-nilai Anda.
Christiaan Westerbeek
3
Perhatikan juga jika nilai Anda bukan numerik, Anda memerlukannya COUNTA. COUNThanya menghitung nilai numerik: ini akan mengembalikan 0 jika diberikan misalnya sel teks.
Air
53

Sebenarnya saya menemukan solusi yang lebih sederhana di sini:

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

Ini terlihat seperti ini:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
Getas
sumber
2
Wow ini sangat bersih. Bisakah Anda menjelaskan dengan tepat cara kerjanya?
cambraca
Tidak juga: ini tepat hanya ketika rentang sumber sudah diurutkan.
caligari
5
Dijelaskan: ROWmengembalikan nomor baris, sehingga FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )mengembalikan larik dari semua nomor baris yang tidak kosong (bukan nilainya), misalnya [1,2, 3, 7, 12, 14]. Kemudian MAXberi kami nomor baris terakhir. Detik FILTERkemudian diterapkan untuk menyaring semua baris di mana nomor baris tidak cocok dengan nilai dari MAX(yaitu nilai dari baris tidak kosong terakhir).
jhabbott
Kedua contoh ROW dapat diganti dengan COLUMN untuk mengembalikan nilai terakhir di baris tertentu (bukan nilai terakhir di kolom tertentu).
Jon Schneider
2
Bagaimana jika saya hanya menginginkan nomor baris dari nilai terakhir kolom?
Nick5a1
44

Fungsi LAST () tidak diterapkan saat ini untuk memilih sel terakhir dalam suatu rentang. Namun, mengikuti contoh Anda:

=LAST(G2:G9999)

kita bisa mendapatkan sel terakhir menggunakan beberapa fungsi INDEX () dan COUNT () dengan cara ini:

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

Ada contoh langsung di spreedsheet di mana saya telah menemukan (dan memecahkan) masalah yang sama (lembar Orzamentos, sel I5). Perhatikan bahwa ini bekerja dengan sempurna bahkan mengacu pada lembar lain di dalam dokumen.

caligari
sumber
1
Ini berfungsi dengan baik, dan diperbarui secara otomatis saat lembar berubah. Terima kasih!
TinaMarie
8
Saya suka keringkasan dari saran ini, tetapi tampaknya tidak berfungsi ketika rentang target menyertakan beberapa sel kosong (seperti yang disebutkan dalam pertanyaan asli di atas), karena COUNT () tidak menghitung sel kosong.
Jon Schneider
@JonSchneider dapat Anda gunakan COUNTAdalam kasus itu jika Anda yakin tidak ada satu pun yang kosong di antara nilai-nilai dalam kolom. Lihat komentar saya untuk jawaban dohmoose.
Christiaan Westerbeek
Mengapa :Gmenunjukkan elemen terakhir? Apakah ini didokumentasikan?
flow2k
33

Ringkasan:

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

Rincian:

Saya telah memeriksa dan mencoba beberapa jawaban, dan inilah yang saya temukan: Solusi paling sederhana (lihat jawaban Dohmoose ) berfungsi jika tidak ada yang kosong:

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

Jika Anda memiliki kekosongan, itu gagal.

Anda dapat menangani satu kosong hanya dengan mengubah dari COUNTmenjadi COUNTA (Lihat jawaban pengguna3280071 ):

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

Namun, ini akan gagal untuk beberapa kombinasi kosong. ( 1 blank 1 blank 1gagal untuk saya.)

Kode berikut berfungsi (Lihat jawaban Nader dan komentar jason ):

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

tetapi membutuhkan pemikiran tentang apakah Anda ingin menggunakan COLUMNSatau ROWSuntuk rentang tertentu.

Namun, jika COLUMNSdiganti dengan COUNTsaya sepertinya mendapatkan implementasi yang andal dan kosong dari LAST:

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

Dan karena COUNTAmemiliki filter bawaan, kita dapat menyederhanakan lebih lanjut menggunakan

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

Ini agak sederhana, dan benar. Dan Anda tidak perlu khawatir apakah akan menghitung baris atau kolom. Dan tidak seperti solusi skrip, ini secara otomatis diperbarui dengan perubahan pada spreadsheet.

Dan jika Anda ingin mendapatkan nilai terakhir berturut-turut, cukup ubah rentang datanya:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Doug Bradshaw
sumber
Sangat membantu untuk berjalan melalui langkah-langkah dan fungsionalitas + batasan dari setiap iterasi. Saya perlu mendapatkan nilai terakhir di setiap baris, beberapa dengan beberapa kosong. Ini bekerja seperti pesona. Terima kasih!
Christiaan Adams
9

Untuk mengembalikan nilai terakhir dari kolom nilai teks, Anda perlu menggunakan COUNTA, jadi Anda memerlukan rumus ini:

=INDEX(G2:G; COUNTA(G2:G))
pengguna3280071
sumber
1
Tetapi hanya jika tidak ada satu pun kosong di antara nilai-nilai Anda. Jika ada, COUNTAdigabungkan dengan INDEXtidak akan mengembalikan nilai terakhir di kolom.
Christiaan Westerbeek
7

coba ini: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Misalkan kolom tempat Anda mencari nilai terakhir adalah B.

Dan ya, ini berfungsi dengan kosong.

Andrew Anderson
sumber
6

Sepertinya Google Apps Script sekarang mendukung rentang sebagai parameter fungsi. Solusi ini menerima kisaran:

// 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;
}

Lihat juga diskusi di forum bantuan Skrip Google Apps: Bagaimana cara memaksa rumus untuk menghitung ulang?

craig3353
sumber
6

Saya melihat jawaban sebelumnya dan sepertinya mereka bekerja terlalu keras. Mungkin dukungan scripting telah meningkat. Menurut saya fungsinya diekspresikan seperti ini:

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

Dalam spreadsheet saya, saya kemudian menggunakan:

= lastValue(E17:E999)

Dalam fungsinya, saya mendapatkan array nilai dengan satu per sel yang direferensikan dan ini hanya mengulang dari akhir array ke belakang sampai menemukan nilai yang tidak kosong atau kehabisan elemen. Referensi sheet harus diinterpretasikan sebelum data diteruskan ke fungsi. Juga tidak cukup mewah untuk menangani multi-dimensi. Pertanyaannya memang menanyakan sel terakhir dalam satu kolom, jadi sepertinya cocok. Ini mungkin akan mati jika Anda kehabisan data juga.

Jarak tempuh Anda mungkin berbeda, tetapi ini berhasil untuk saya.

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

tidak ada pengkodean yang sulit.

desnyki
sumber
5

Yang ini berhasil untuk saya:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Pedro
sumber
Solusi bagus, yang juga berfungsi dengan adanya sel kosong.
jochen
5

Ini mendapatkan nilai terakhir dan menangani nilai kosong:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
Nader
sumber
bekerja untuk kolom juga. Saya hanya mengganti beberapa hal. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason
solusi umum:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason
Bagi saya, ini adalah jawaban yang "benar". Sangat kompak dan mudah dimengerti, dan berfungsi dengan blanko.
aardvarkk
4

Di kolom dengan kosong, Anda bisa mendapatkan nilai terakhir dengan

=+sort(G:G,row(G:G)*(G:G<>""),)
JPV
sumber
Solusi yang bagus. Saya menduga varian @ Pedro (menggunakan INDEX dan MAX) mungkin sedikit lebih efisien daripada menggunakan SORT.
jochen
4

Jawabannya

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

tidak berfungsi dengan benar di LibreOffice. Namun, dengan sedikit perubahan, ini berfungsi dengan sempurna.

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

Ini selalu berfungsi hanya jika rentang sebenarnya lebih kecil dari (G2:G10000)

Manuel Ferreira
sumber
Pos ini diberi tag "Google Spreadsheet" dan "Google Apps Script", tidak ada yang berhubungan dengan Libre Office ... Anda keluar topik
Serge insas
Tidak terlalu jauh dari topik sebagai judul pertanyaan, Memilih nilai terakhir kolom , dapat dengan mudah ditemukan oleh orang yang malang menggunakan LibreOffice atau Numbers. Saya seorang amatir spreadsheet yang cukup tahu untuk menjadi berbahaya. Apa yang dapat saya kumpulkan adalah bahwa Google telah membuatnya sehingga jika argumen kedua Anda untuk suatu rentang hanyalah kolom, itu akan memilih sisa kolom sehingga orang tidak perlu menggunakan jumlah yang sangat besar peretasan yang Anda temukan.
Aaron
3

Apakah menjawab pertanyaan awal dengan jawaban yang benar-benar di luar topik dapat diterima :) Anda dapat menulis rumus di spreadsheet untuk melakukan ini. Mungkin jelek? tetapi efektif dalam pengoperasian normal spreadsheet.

=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

Ini ditawarkan sebagai pemikiran untuk berbagai pertanyaan di bidang skrip yang dapat disampaikan dengan andal dengan rumus array yang memiliki keuntungan sering bekerja dengan cara yang sama di excel dan openoffice.

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

Saya bermain dengan kode yang diberikan oleh @tinfini, dan berpikir orang mungkin mendapat manfaat dari apa yang menurut saya merupakan solusi yang sedikit lebih elegan (perhatikan saya tidak berpikir skrip bekerja dengan cara yang sama ketika dia membuat jawaban asli) ...

//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]);
}

Dalam penggunaannya akan terlihat seperti ini:

=LastInRange(D2:D)
Jonathan Cavell
sumber
2

Mengenai komentar @ Jon_Schneider, jika kolom ada sel kosong gunakan saja COUNTA ()

=INDEX(G2:G; COUNT**A**(G2:G))
pedro
sumber
4
Tidak, itu juga tidak berhasil. Perbedaan antara JUMLAH dan COUNTA terletak pada perbedaan antara angka dan teks, yang tidak relevan di sini.
mhsmith
2

Menemukan sedikit variasi yang berfungsi untuk menghilangkan kekosongan dari bagian bawah tabel. = indeks (G2: G, COUNTIF (G2: G, "<>"))

Chris
sumber
1

Saya terkejut tidak ada yang pernah memberikan jawaban ini sebelumnya. Tetapi ini harus menjadi yang terpendek dan bahkan berfungsi di excel:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>""membuat array 1 / true (1) dan 1 / false (0). Sejak LOOKUPmelakukan pendekatan top-down untuk menemukan2 dan Karena tidak akan pernah menemukan 2, ia muncul ke baris terakhir yang tidak kosong dan memberikan posisinya.

Cara lain untuk melakukan ini, seperti yang mungkin telah disebutkan orang lain, adalah:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Menemukan MAXimum ROWdari baris yang tidak kosong dan mengumpankannya keINDEX

Dalam array interupsi kosong nol, Menggunakan INDIRECT RCnotasi dengan COUNTBLANK adalah opsi lain. Jika V4: V6 ditempati dengan entri, maka,

V18 :

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

akan memberikan posisi V6.

TheMaster
sumber
1

untuk mendapatkan nilai terakhir dari kolom Anda juga dapat menggunakan MAXfungsi dengan IFfungsi

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
pemain0
sumber