Jawaban:
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.
Jawaban serupa untuk jawaban caligari , tetapi kita dapat merapikannya hanya dengan menentukan rentang kolom lengkap:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
rentang ed, mirip dengan jawaban @ Geta .
COUNT(G2:G)
mengembalikan 0. Sebaliknya gunakan COUNTA(G2:G)
itu hanya menghitung jumlah nilai dalam kumpulan data. COUNTA
hanya berguna jika dikombinasikan dengan INDEX
untuk mendapatkan nilai terakhir jika tidak ada satu pun yang kosong di antara nilai-nilai Anda.
COUNTA
. COUNT
hanya menghitung nilai numerik: ini akan mengembalikan 0 jika diberikan misalnya sel teks.
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)))))
ROW
mengembalikan 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 MAX
beri kami nomor baris terakhir. Detik FILTER
kemudian diterapkan untuk menyaring semua baris di mana nomor baris tidak cocok dengan nilai dari MAX
(yaitu nilai dari baris tidak kosong terakhir).
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.
COUNTA
dalam kasus itu jika Anda yakin tidak ada satu pun yang kosong di antara nilai-nilai dalam kolom. Lihat komentar saya untuk jawaban dohmoose.
:G
menunjukkan elemen terakhir? Apakah ini didokumentasikan?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
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 COUNT
menjadi COUNTA
(Lihat jawaban pengguna3280071 ):
=INDEX(G2:G; COUNTA(G2:G))
Namun, ini akan gagal untuk beberapa kombinasi kosong. ( 1 blank 1 blank 1
gagal 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 COLUMNS
atau ROWS
untuk rentang tertentu.
Namun, jika COLUMNS
diganti dengan COUNT
saya 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 COUNTA
memiliki 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) )
Untuk mengembalikan nilai terakhir dari kolom nilai teks, Anda perlu menggunakan COUNTA, jadi Anda memerlukan rumus ini:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
digabungkan dengan INDEX
tidak akan mengembalikan nilai terakhir di kolom.
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.
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?
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.
Ini mendapatkan nilai terakhir dan menangani nilai kosong:
=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()))) ) ) )
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)
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.
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)
Saya menemukan cara lain mungkin itu akan membantu Anda
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-akan kembali baris terakhir
Info lebih lanjut dari anab di sini: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
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 LOOKUP
melakukan 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 MAX
imum ROW
dari baris yang tidak kosong dan mengumpankannya keINDEX
Dalam array interupsi kosong nol, Menggunakan INDIRECT
RC
notasi 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.
Tools -> Scripts -> Script editor...