Bir sütunun son değerini seçme


Yanıtlar:


54

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.


5
Bu bir Google Elektronik Tablo komut dosyasıdır. Yeni bir komut dosyası oluşturabilirsinizTools -> Scripts -> Script editor...
tinifni

1
: O harika! Google'ın komut dosyalarını uyguladığını bilmiyordum. Çok teşekkür ederim, mükemmel çalıştı
cambraca

1
sayfadaki verileri değiştirdiğimde otomatik olarak nasıl güncelleneceği hakkında bir fikriniz var mı?
cambraca

Cevabımı yardımcı olacak bazı bilgilerle düzenledim. Mutlu kodlamalar!
tinifni

5
LastValue ("Sayfa1! A") gist.github.com/2701061
johnwards

165

Caligari'nin cevabına benzer cevap , ancak tam sütun aralığını belirterek bunu düzeltebiliriz:

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

12
Bu, veri kümesinde boşluk olmadığı sürece işe yarıyor gibi görünüyor
Keith Sirmons

Bir başka iyi kaynak, productforums.google.com/forum/#!topic/docs/p3t3feg7Jic adresinde 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 .
Aaron Blenkush

Bu yanıt stackoverflow.com/a/8161172/418111 , boşluk hücreleri destekleyen bir formüle sahiptir.
Daniel

8
@ KeithSirmons'ın bahsettiği gibi. Sütununuzda boşluklar var, işe yaramıyor çünkü 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 COUNTAile birlikte kullanışlıdır INDEX.
Christiaan Westerbeek

3
Ayrıca değerleriniz sayısal değilse ihtiyacınız olacak COUNTA. COUNTyalnızca sayısal değerleri sayar: verildiğinde 0 döndürür, örneğin metin hücreleri.
Air

53

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

2
Vay canına, bu inanılmaz derecede temiz. Nasıl çalıştığını tam olarak açıklayabilir misin?
cambraca

Pek değil: tam olarak kaynak aralığı zaten sıralandığında doğrudur.
caligari

5
Açıklama: ROWsatı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 MAXbize son satır numarasını verir. FILTERArdı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).
jhabbott

Her iki SATIR örneği, belirli bir satırdaki son değeri döndürmek için (belirli bir sütundaki son değer yerine) COLUMN ile değiştirilebilir.
Jon Schneider

2
Ya sadece sütunun son değerinin satır numarasını istersem?
Nick5a1

44

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 Orzamentoshücre I5). Belgedeki diğer sayfalara başvururken bile mükemmel çalıştığını unutmayın.


1
Bu harika çalışıyor ve sayfa değiştikçe otomatik olarak güncelleniyor. Teşekkürler!
TinaMarie

8
Bu önerinin özlü olmasını seviyorum, ancak COUNT () boş hücreleri saymadığı için, hedef aralık bazı boş hücreler içerdiğinde (yukarıdaki orijinal soruda belirtildiği gibi) işe yaramıyor gibi görünüyor.
Jon Schneider

@JonSchneider 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.
Christiaan Westerbeek

Neden :Gson öğeyi ifade ediyor? Bu belgelenmiş mi?
flow2k

33

Özet:

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

Detaylar:

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 COUNTiç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 1benim 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 COLUMNSveya ROWSbelirli bir aralığı için.

Bununla birlikte, eğer COLUMNSile değiştirilirse, COUNTgü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 COUNTAfiltre 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) )

Her yinelemenin adımlarını ve işlevselliğini + sınırlamalarını aşmak için süper yararlı. Her satırdaki son değeri almam gerekiyordu, bazılarında birden çok boşluk vardı. Bu harika çalıştı. Teşekkür ederim!
Christiaan Adams

9

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

1
Ama sadece değerleriniz arasında tek bir boşluk yoksa. Varsa, ile COUNTAbirleştirildiğinde INDEXsütundaki son değeri döndürmez.
Christiaan Westerbeek

7

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.


6

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?


6

Ö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.


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

sert kodlama yok.


5

Bu benim için çalışıyor:

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

Boş hücrelerin varlığında da işe yarayan güzel bir çözüm.
jochen

5

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

sütunlar için de çalışır. Ben sadece birkaç şeyi değiştirdim. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason

genel çözüm:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason

Bana göre bu "doğru" cevap. Makul ölçüde kompakt ve anlaşılması kolay ve boşluklarla çalışır.
aardvarkk

4

Boşluklu bir sütunda, son değeri şu şekilde alabilirsiniz:

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

Güzel bir çözüm. @ Pedro'nun varyantının (INDEX ve MAX kullanarak) SORT kullanmaktan biraz daha verimli olabileceğinden şüpheleniyorum.
jochen

4

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)


Bu gönderi "Google E-Tablo" ve "Google Apps Komut Dosyası" olarak etiketlendi, Libre Office ile ilgili hiçbir şey yok ... konu
dışındasın

Sorunun başlığı, bir sütunun son değerinin seçilmesi, LibreOffice veya Numbers kullanılarak fakir bir kişi tarafından kolayca bulunabileceğinden, konuya çok da uzak değil . Ben yeterince tehlikeli olduğunu bilen bir elektronik tablo amatörüyüm. Toplayabildiğim şey şu ki, Google bunu yaptı, böylece bir aralık için ikinci argümanınız sadece bir sütunsa, sütunun geri kalanını seçecek, böylece insanlar keşfettiğiniz çok sayıda hack'i kullanmak zorunda kalmayacak.
Aaron

3

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 .


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

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

2

@ Jon_Schneider'ın yorumuyla ilgili olarak, sütunda boş hücreler varsa yalnızca COUNTA () kullanın

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

4
Hayır, bu da çalışmıyor. COUNT ve COUNTA arasındaki fark, burada alakasız olan sayılar ve metin arasındaki ayrımdadır.
mhsmith


2

Tablonun altındaki boşlukları ortadan kaldırmak için çalışan küçük bir varyasyon buldum. = dizin (G2: G, EĞERSAY (G2: G, "<>"))


1

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 LOOKUPbulmak için yaklaşım aşağı üst yapar 2ve 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 MAXimumunu bulmak ROWve onu beslemekINDEX

Sıfır boşluklu bir kesinti dizisinde, INDIRECT RCgö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.


1

Ayrıca kullanabileceğiniz bir sütundan son değeri elde etmek MAXile işlevini IFfonksiyonu

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.