Yanıtlar:
Dolayısıyla bu çözüm, parametresi olarak bir dizge alır. Sayfada kaç satır olduğunu bulur. Belirtilen sütundaki tüm değerleri alır. Boş bir dize olmayan bir değer bulana kadar sondan başa kadar değerler arasında döngü yapar. Sonunda değeri geri alır.
Senaryo:
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];
}
Kullanım:
=lastValue("G")
DÜZENLE:
İşlevin otomatik olarak güncellenmesini isteyen yoruma yanıt olarak:
Bulabildiğim en iyi yol, bunu yukarıdaki kodla kullanmaktır:
function onEdit(event) {
SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
İşlevin Kullanım bölümünün durumları gibi bir hücrede kullanılması artık gerekli olmayacaktır . Bunun yerine, güncellemek istediğiniz hücreyi ve izlemek istediğiniz sütunu sabit kodluyorsunuz. Bunu gerçekleştirmenin daha anlamlı bir yolu olabilir (umarım sabit kodlanmamış bir yol), ancak şimdilik bulabildiğim en iyisi budur.
Hücredeki işlevi daha önce belirtildiği gibi kullanırsanız, yeniden yüklendiğinde güncelleneceğini unutmayın. Belki de onEdit()
hücre işlevlerini güncellemeye zorlamanın bir yolu vardır . Belgelerde bulamıyorum.
Caligari'nin cevabına benzer cevap , ancak tam sütun aralığını belirterek bunu düzeltebiliriz:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
, @ Geta'nın cevabına benzer şekilde, bir ed aralığında ilk, son veya n. Satırın nasıl alınacağını gösteren seçili cevaptır .
COUNT(G2:G)
0 döndürüyor. Bunun yerine COUNTA(G2:G)
, yalnızca veri kümesindeki değerlerin sayısını sayan kullanın . Değerleriniz arasında tek bir boşluk yoksa, son değeri almak için COUNTA
ile birlikte kullanışlıdır INDEX
.
COUNTA
. COUNT
yalnızca sayısal değerleri sayar: verildiğinde 0 döndürür, örneğin metin hücreleri.
Aslında burada daha basit bir çözüm buldum:
http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=en
Şöyle görünüyor:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
ROW
satır numarasını FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
döndürür , dolayısıyla boş olmayan tüm satır numaralarını (değerlerini değil) içeren bir dizi döndürür, örneğin [1,2, 3, 7, 12, 14]. Sonra MAX
bize son satır numarasını verir. FILTER
Ardından, satır numarasının değeriyle eşleşmediği tüm satırları filtrelemek için bir saniye uygulanır MAX
(yani, boş olmayan son satırın değeri).
Bir aralıktaki son hücreyi seçmek için şu anda LAST () işlevi uygulanmamaktadır. Ancak, örneğinize göre:
=LAST(G2:G9999)
INDEX () ve COUNT () işlevlerinin çiftini bu şekilde kullanarak son hücreyi elde edebiliriz :
=INDEX(G2:G; COUNT(G2:G))
Bir yoktur canlı örneği buldum (ve çözülen) Aynı sorun (levha var e-tabloda en Orzamentos
hücre I5
). Belgedeki diğer sayfalara başvururken bile mükemmel çalıştığını unutmayın.
COUNTA
, bu durumda sütundaki değerler arasında tek bir boşluk olmadığından eminseniz kullanabilirsiniz . Dohmoose'un cevabına yaptığım yorumları görün.
:G
son öğeyi ifade ediyor? Bu belgelenmiş mi?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Birkaç cevaba baktım ve denedim ve bulduğum şey şudur : En basit çözüm ( Dohmoose'un cevabına bakın ) boşluk yoksa işe yarar:
=INDEX(G2:G; COUNT(G2:G))
Boşluklarınız varsa, başarısız olur.
Sadece değişen tek boş işleyebilir COUNT
için COUNTA
(Bkz user3280071 cevabı ):
=INDEX(G2:G; COUNTA(G2:G))
Ancak bu, bazı boşluk kombinasyonları için başarısız olacaktır. ( 1 blank 1 blank 1
benim için başarısız.)
Aşağıdaki kod işe yarıyor ( Nader'in cevabına ve jason'un yorumuna bakın ):
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
ama kullanmak istediğiniz konusunda düşünme gerektiren COLUMNS
veya ROWS
belirli bir aralığı için.
Bununla birlikte, eğer COLUMNS
ile değiştirilirse, COUNT
güvenilir, boş geçirmez bir uygulama elde ediyorum LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Ve COUNTA
filtre yerleşik olduğundan , kullanımı daha da basitleştirebiliriz
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
Bu biraz basit ve doğrudur. Ve satırları mı sütunları mı sayacağınız konusunda endişelenmenize gerek yok. Ve komut dosyası çözümlerinden farklı olarak, elektronik tablodaki değişikliklerle otomatik olarak güncellenir.
Ve bir satırdaki son değeri almak istiyorsanız, veri aralığını değiştirin:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Bir metin değerleri sütunundan son değeri döndürmek için COUNTA kullanmanız gerekir, bu nedenle şu formüle ihtiyacınız olacaktır:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
birleştirildiğinde INDEX
sütundaki son değeri döndürmez.
bunu dene:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Son değeri aradığınız sütunun B olduğunu varsayalım.
Ve evet, boşluklarla çalışıyor.
Görünüşe göre Google Apps Komut Dosyası artık işlev parametreleri olarak aralıkları destekliyor. Bu çözüm bir aralığı kabul eder:
// 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;
}
Ayrıca Google Apps Komut Dosyası yardım forumundaki tartışmaya bakın: Formülleri yeniden hesaplamaya nasıl zorlarım?
Önceki cevaplara baktım ve çok çalışıyor gibi görünüyorlar. Belki komut dosyası desteği basitçe gelişmiştir. Sanırım işlev şu şekilde ifade ediliyor:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
Elektronik tablomda daha sonra kullanıyorum:
= lastValue(E17:E999)
İşlevde, başvurulan hücre başına bir değer dizisi alıyorum ve bu, boş olmayan bir değer bulana veya elemanların bitmesine kadar dizinin sonundan geriye doğru yineleniyor. Veriler işleve aktarılmadan önce sayfa referansları yorumlanmalıdır. Çok boyutları kullanacak kadar da fantezi değil. Soru, tek bir sütundaki son hücreyi sordu, bu yüzden uygun görünüyor. Siz de verileriniz biterse muhtemelen ölür.
Kilometreniz değişebilir, ancak bu benim için işe yarıyor.
Bu, son değeri alır ve boş değerleri işler:
=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()))) ) ) )
Cevap
$ =INDEX(G2:G; COUNT(G2:G))
LibreOffice'de düzgün çalışmıyor. Ancak küçük bir değişiklikle mükemmel çalışıyor.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Her zaman yalnızca gerçek aralık şundan küçükse çalışır (G2:G10000)
Orijinal soruyu kesinlikle konu dışı bir cevapla cevaplamak kabul edilebilir mi :) Bunu yapmak için elektronik tabloya bir formül yazabilirsiniz. Belki çirkin? ancak bir elektronik tablonun normal çalışmasında etkilidir.
=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
Bu, senaryo alanında, Excel ve openoffice'te genellikle benzer şekilde çalışma avantajına sahip dizi formülleriyle güvenilir bir şekilde teslim edilebilecek bir dizi soru için bir düşünce olarak sunulur .
@Tinfini tarafından verilen kodla oynuyordum ve insanların benim düşündüğüm biraz daha zarif bir çözümden faydalanabileceğini düşündüm (not, orijinal cevabı oluşturduğunda senaryoların tamamen aynı şekilde çalıştığını düşünmüyorum) ...
//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]);
}
Kullanımda şöyle görünecektir:
=LastInRange(D2:D)
Sana yardım edecek başka bir yol buldum
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-son satıra dönecek
Buradaki anab'den daha fazla bilgi: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Daha önce kimsenin bu cevabı vermemiş olmasına şaşırdım. Ancak bu en kısa olmalı ve hatta mükemmel şekilde çalışıyor:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
1 / true (1) ve 1 / false (0) dizisi oluşturur. Yana LOOKUP
bulmak için yaklaşım aşağı üst yapar 2
ve 2 bulmak asla bu yana, son sigara boş satıra gelir ve bu konumunu verir.
Başkalarının da bahsetmiş olabileceği gibi, bunu yapmanın diğer yolu şudur:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Boş olmayan satırın MAX
imumunu bulmak ROW
ve onu beslemekINDEX
Sıfır boşluklu bir kesinti dizisinde, INDIRECT
RC
gösterimi kullanmak COUNTBLANK
başka bir seçenektir. V4: V6 girişlerle dolu ise, o zaman,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
V6'nın konumunu verecektir.
Tools -> Scripts -> Script editor...