การเลือกค่าสุดท้ายของคอลัมน์


106

ฉันมีสเปรดชีตที่มีค่าบางอย่างในคอลัมน์ G บางเซลล์ว่างอยู่ระหว่างนั้นและฉันต้องการรับค่าสุดท้ายจากคอลัมน์นั้นไปยังเซลล์อื่น

สิ่งที่ต้องการ:

=LAST(G2:G9999)

ยกเว้นว่าLASTไม่ใช่ฟังก์ชัน

คำตอบ:


54

ดังนั้นโซลูชันนี้จึงใช้สตริงเป็นพารามิเตอร์ พบว่ามีกี่แถวในแผ่นงาน ได้รับค่าทั้งหมดในคอลัมน์ที่ระบุ จะวนซ้ำค่าจากจุดสิ้นสุดไปยังจุดเริ่มต้นจนกว่าจะพบค่าที่ไม่ใช่สตริงว่าง ในที่สุดก็เรียกคืนค่า

สคริปต์:

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

การใช้งาน:

=lastValue("G")

แก้ไข:

ในการตอบกลับความคิดเห็นที่ขอให้ฟังก์ชันอัปเดตโดยอัตโนมัติ:

วิธีที่ดีที่สุดที่ฉันพบคือใช้สิ่งนี้กับรหัสด้านบน:

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

ไม่จำเป็นต้องใช้ฟังก์ชันในเซลล์เช่นสถานะส่วนการใช้งานอีกต่อไป แต่คุณกำลังเข้ารหัสเซลล์ที่คุณต้องการอัปเดตและคอลัมน์ที่คุณต้องการติดตามอย่างหนัก เป็นไปได้ว่ามีวิธีที่ชัดเจนกว่านี้ในการนำไปใช้ (หวังว่าจะเป็นวิธีที่ไม่ยากที่จะเข้ารหัส) แต่นี่เป็นวิธีที่ดีที่สุดที่ฉันสามารถหาได้ในตอนนี้

โปรดทราบว่าหากคุณใช้ฟังก์ชันในเซลล์ตามที่ระบุไว้ก่อนหน้านี้ฟังก์ชันจะอัปเดตเมื่อโหลดซ้ำ อาจมีวิธีเชื่อมต่อonEdit()และบังคับให้ฟังก์ชันเซลล์อัปเดต ฉันไม่พบในเอกสาร


5
นี่คือสคริปต์ Google Spreadsheet คุณสามารถสร้างสคริปต์ใหม่ภายใต้Tools -> Scripts -> Script editor...
tinifni

1
: O ที่น่าทึ่ง! ฉันไม่รู้ว่า Google ได้ใช้สคริปต์ ขอบคุณมากมันทำงานได้อย่างสมบูรณ์
cambraca

1
มีความคิดอย่างไรที่จะอัปเดตโดยอัตโนมัติเมื่อฉันเปลี่ยนข้อมูลในแผ่นงาน
cambraca

ฉันแก้ไขคำตอบด้วยข้อมูลบางอย่างที่น่าจะช่วยได้ ขอให้สนุกกับการเขียนโค้ด!
tinifni

5
ฉันได้ทำการแก้ไขสคริปต์นี้เพื่อให้คุณสามารถส่งแผ่นงานที่มีชื่อเป็น lastValue ("Sheet1! A") gist.github.com/2701061
johnwards

165

คำตอบที่คล้ายกันสำหรับคำตอบของ caligariแต่เราสามารถจัดระเบียบได้โดยระบุช่วงคอลัมน์ทั้งหมด:

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

12
ดูเหมือนว่าจะใช้งานได้ตราบเท่าที่ไม่มีช่องว่างในชุดข้อมูล
Keith Sirmons

ทรัพยากรที่ดีอีกอย่างหนึ่งคือคำตอบที่เลือกที่productforums.google.com/forum/#!topic/docs/p3t3feg7Jicซึ่งแสดงให้เห็นถึงวิธีการที่จะได้รับเป็นครั้งแรกที่ผ่านมาหรือที่ n แถวในFILTER()ช่วงเอ็ดคล้ายกับ@ คำตอบของ
Aaron Blenkush

คำตอบนี้stackoverflow.com/a/8161172/418111มีสูตรที่รองรับเซลล์ว่าง
Daniel

8
ดังที่ @KeithSirmons กล่าวถึง. มีช่องว่างในคอลัมน์ของคุณซึ่งไม่สามารถใช้งานได้เนื่องจากCOUNT(G2:G)ส่งคืนค่า 0 ให้ใช้การCOUNTA(G2:G)นับเฉพาะจำนวนค่าในชุดข้อมูลแทน COUNTAจะมีประโยชน์เฉพาะเมื่อรวมกับINDEXเพื่อรับค่าสุดท้ายหากไม่มีช่องว่างระหว่างค่าของคุณ
Christiaan Westerbeek

3
โปรดทราบด้วยว่าค่าของคุณไม่ใช่ตัวเลขคุณจะต้องCOUNTAใช้ COUNTนับเฉพาะค่าตัวเลข: จะส่งกลับ 0 เมื่อกำหนดเช่นเซลล์ข้อความ
อากาศ

53

อันที่จริงฉันพบวิธีแก้ปัญหาที่ง่ายกว่าที่นี่:

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

ดูเหมือนว่า:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))

2
ว้าวนี่สะอาดอย่างไม่น่าเชื่อ คุณสามารถอธิบายได้ว่ามันทำงานอย่างไร?
cambraca

ไม่จริง: ถูกต้องเมื่อจัดเรียงช่วงแหล่งที่มาแล้ว
caligari

5
อธิบาย: ROWส่งคืนหมายเลขแถวดังนั้นFILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )ส่งคืนอาร์เรย์ของตัวเลขแถวที่ไม่ว่างทั้งหมด (ไม่ใช่ค่า) เช่น [1,2, 3, 7, 12, 14] จากนั้นMAXให้หมายเลขแถวสุดท้ายแก่เรา FILTERจากนั้นวินาทีจะถูกใช้เพื่อกรองแถวทั้งหมดที่หมายเลขแถวไม่ตรงกับค่าจากMAX(เช่นค่าของแถวสุดท้ายที่ไม่ว่าง)
jhabbott

ROW ทั้งสองอินสแตนซ์สามารถถูกแทนที่ด้วย COLUMN เพื่อส่งคืนค่าสุดท้ายในแถวหนึ่ง ๆ (แทนค่าสุดท้ายในคอลัมน์ใดคอลัมน์หนึ่ง)
Jon Schneider

2
จะเป็นอย่างไรถ้าฉันต้องการเพียงแค่หมายเลขแถวของค่าสุดท้ายของคอลัมน์
Nick5a1

44

ฟังก์ชัน LAST () ไม่ได้ใช้งานในขณะนี้เพื่อเลือกเซลล์สุดท้ายภายในช่วง อย่างไรก็ตามทำตามตัวอย่างของคุณ:

=LAST(G2:G9999)

เราสามารถรับเซลล์สุดท้ายโดยใช้สองฟังก์ชันINDEX ()และCOUNT ()ด้วยวิธีนี้:

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

มีตัวอย่างสดที่ spreedsheet ที่ฉันพบ (และแก้ไข) ปัญหาเดียวกัน (แผ่นงานOrzamentosเซลล์I5) โปรดทราบว่าสามารถทำงานได้อย่างสมบูรณ์แบบแม้กระทั่งการอ้างถึงแผ่นงานอื่น ๆ ภายในเอกสาร


1
วิธีนี้ใช้งานได้ดีและอัปเดตอัตโนมัติเมื่อแผ่นงานเปลี่ยนไป ขอบคุณ!
TinaMarie

8
ฉันชอบความกระชับของคำแนะนำนี้ แต่ดูเหมือนจะไม่ได้ผลเมื่อช่วงเป้าหมายมีเซลล์ว่าง (ตามที่กล่าวไว้ในคำถามเดิมด้านบน) เนื่องจาก COUNT () ไม่นับเซลล์ว่าง
Jon Schneider

@JonSchneider คุณสามารถใช้COUNTAในกรณีนั้นได้หากคุณแน่ใจว่าไม่มีช่องว่างระหว่างค่าในคอลัมน์ ดูความคิดเห็นของฉันเพื่อตอบคำถามของ dohmoose
Christiaan Westerbeek

ทำไม:Gถึงแสดงถึงองค์ประกอบสุดท้าย? นี่เป็นเอกสารหรือไม่?
flow2k

33

สรุป:

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

รายละเอียด:

ฉันได้ตรวจสอบและลองคำตอบหลายข้อแล้วและนี่คือสิ่งที่ฉันพบ: วิธีแก้ปัญหาที่ง่ายที่สุด (ดูคำตอบของ Dohmoose ) ใช้ได้ผลหากไม่มีช่องว่าง:

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

หากคุณมีช่องว่างก็จะล้มเหลว

คุณสามารถจัดการช่องว่างได้เพียงแค่เปลี่ยนจากCOUNTเป็นCOUNTA (ดูคำตอบของ user3280071 ):

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

อย่างไรก็ตามการดำเนินการนี้จะล้มเหลวสำหรับช่องว่างบางชุด ( 1 blank 1 blank 1ล้มเหลวสำหรับฉัน)

รหัสต่อไปนี้ใช้งานได้ (ดูคำตอบของ Naderและความคิดเห็นของ Jason ):

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

แต่ต้องคิดว่าคุณต้องการใช้COLUMNSหรือROWSช่วงที่กำหนด

อย่างไรก็ตามหากCOLUMNSถูกแทนที่ด้วยCOUNTฉันดูเหมือนว่าจะได้รับการใช้งานที่เชื่อถือได้และไม่มีหลักฐานการใช้งานLAST:

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

และเนื่องจากCOUNTAมีตัวกรองในตัวเราจึงสามารถใช้งานได้ง่ายขึ้น

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

นี่ค่อนข้างง่ายและถูกต้อง และคุณไม่ต้องกังวลว่าจะนับแถวหรือคอลัมน์ และต่างจากโซลูชันสคริปต์คือจะอัปเดตโดยอัตโนมัติพร้อมกับการเปลี่ยนแปลงในสเปรดชีต

และถ้าคุณต้องการรับค่าสุดท้ายในแถวเพียงแค่เปลี่ยนช่วงข้อมูล:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )

มีประโยชน์มากในการทำตามขั้นตอนและฟังก์ชัน + ข้อ จำกัด ของการทำซ้ำแต่ละครั้ง ฉันต้องการรับค่าสุดท้ายในแต่ละแถวบางช่องมีช่องว่างหลายช่อง สิ่งนี้ได้ผลเหมือนมีเสน่ห์ ขอบคุณ!
Christiaan Adams

9

ในการส่งคืนค่าสุดท้ายจากคอลัมน์ของค่าข้อความคุณต้องใช้ COUNTA ดังนั้นคุณต้องใช้สูตรนี้:

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

1
แต่ถ้าไม่มีช่องว่างระหว่างค่าของคุณ หากมีการ COUNTAรวมกับINDEXจะไม่ส่งคืนค่าสุดท้ายในคอลัมน์
Christiaan Westerbeek


6

ดูเหมือนว่า Google Apps Script จะสนับสนุนช่วงเป็นพารามิเตอร์ฟังก์ชันแล้ว โซลูชันนี้ยอมรับช่วง:

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

ดูการอภิปรายในฟอรัมความช่วยเหลือของ Google Apps Script: ฉันจะบังคับให้คำนวณสูตรใหม่ได้อย่างไร


6

ฉันดูคำตอบก่อนหน้านี้และดูเหมือนว่าพวกเขาทำงานหนักเกินไป บางทีการรองรับการเขียนสคริปต์อาจจะดีขึ้น ฉันคิดว่าฟังก์ชันจะแสดงเช่นนี้:

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

ในสเปรดชีตของฉันฉันใช้:

= lastValue(E17:E999)

ในฟังก์ชั่นฉันได้รับอาร์เรย์ของค่าหนึ่งต่อเซลล์ที่อ้างอิงและสิ่งนี้จะวนซ้ำจากท้ายอาร์เรย์ไปข้างหลังจนกว่าจะพบค่าที่ไม่ว่างเปล่าหรือองค์ประกอบหมด ควรตีความการอ้างอิงแผ่นงานก่อนที่ข้อมูลจะถูกส่งไปยังฟังก์ชัน ไม่แฟนซีพอที่จะจัดการกับหลายมิติได้เช่นกัน คำถามถามถึงเซลล์สุดท้ายในคอลัมน์เดียวจึงดูเหมือนจะพอดี มันอาจจะตายถ้าคุณไม่มีข้อมูลด้วย

ไมล์สะสมของคุณอาจแตกต่างกันไป แต่ใช้ได้กับฉัน


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

ไม่มีการเข้ารหัสยาก


5

อันนี้ใช้ได้กับฉัน:

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

เป็นทางออกที่ดีซึ่งทำงานต่อหน้าเซลล์ว่างได้เช่นกัน
jochen

5

สิ่งนี้ได้รับค่าสุดท้ายและจัดการกับค่าว่าง:

=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()))) ) ) )
สัน

สำหรับฉันนี่คือคำตอบที่ "ถูกต้อง" กะทัดรัดและเข้าใจง่ายพอสมควรและใช้งานได้กับช่องว่าง
aardvarkk

4

ในคอลัมน์ที่มีช่องว่างคุณจะได้รับค่าสุดท้ายด้วย

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

ทางออกที่ดี ฉันสงสัยว่าตัวแปรของ @ Pedro (โดยใช้ INDEX และ MAX) อาจมีประสิทธิภาพมากกว่าการใช้ SORT เล็กน้อย
jochen

4

คำตอบ

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

ทำงานไม่ถูกต้องใน LibreOffice อย่างไรก็ตามด้วยการเปลี่ยนแปลงเพียงเล็กน้อยก็ทำงานได้อย่างสมบูรณ์

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

จะใช้งานได้เฉพาะเมื่อช่วงที่แท้จริงมีขนาดเล็กกว่า (G2:G10000)


โพสต์นี้ติดแท็ก "Google Spreadsheet" และ "Google Apps Script" ไม่มีอะไรเกี่ยวข้องกับ Libre Office ... คุณไม่อยู่ในหัวข้อ
Serge insas

ไม่ใช่หัวข้อที่ห่างไกลจากชื่อคำถามมากนักการเลือกค่าสุดท้ายของคอลัมน์สามารถพบได้อย่างง่ายดายโดยวิญญาณที่ไม่ดีบางคนโดยใช้ LibreOffice หรือ Numbers ฉันเป็นมือสมัครเล่นสเปรดชีตที่รู้ดีว่าอันตราย สิ่งที่ฉันสามารถรวบรวมได้คือ Google ได้จัดทำขึ้นเพื่อที่ว่าหากอาร์กิวเมนต์ที่สองของคุณในช่วงเป็นเพียงคอลัมน์ก็จะเลือกส่วนที่เหลือของคอลัมน์เพื่อให้ผู้คนไม่ต้องใช้แฮ็กจำนวนมากที่คุณค้นพบ
Aaron

3

เป็นที่ยอมรับหรือไม่ที่จะตอบคำถามเดิมด้วยคำตอบนอกหัวข้ออย่างเคร่งครัด :) คุณสามารถเขียนสูตรในสเปรดชีตเพื่อทำสิ่งนี้ น่าเกลียดมั้ย? แต่มีประสิทธิภาพในการทำงานปกติของสเปรดชีต

=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

สิ่งนี้นำเสนอเป็นแนวคิดสำหรับคำถามต่างๆในพื้นที่สคริปต์ที่สามารถส่งมอบได้อย่างน่าเชื่อถือด้วยสูตรอาร์เรย์ซึ่งมีข้อได้เปรียบในการทำงานในรูปแบบที่คล้ายคลึงกันใน excel และ 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

ฉันกำลังเล่นกับรหัสที่ @tinfini กำหนดและคิดว่าผู้คนอาจได้รับประโยชน์จากสิ่งที่ฉันคิดว่าเป็นโซลูชันที่หรูหรากว่าเล็กน้อย (โปรดทราบว่าฉันไม่คิดว่าสคริปต์จะทำงานในลักษณะเดียวกันเมื่อเขาสร้างคำตอบเดิม) ...

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

ในการใช้งานจะมีลักษณะดังนี้:

=LastInRange(D2:D)

2

เกี่ยวกับความคิดเห็นของ @ Jon_Schneider หากคอลัมน์มีเซลล์ว่างให้ใช้COUNTA ()

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

4
ไม่นั่นใช้ไม่ได้เช่นกัน ความแตกต่างระหว่าง COUNT และ COUNTA อยู่ที่ความแตกต่างระหว่างตัวเลขและข้อความซึ่งไม่เกี่ยวข้องกับที่นี่
mhsmith

2

ฉันพบวิธีอื่นที่อาจช่วยคุณได้

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) - จะกลับมาแถวสุดท้าย

ข้อมูลเพิ่มเติมจาก anab ที่นี่: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI


1
ไม่จริง: ถูกต้องเมื่อจัดเรียงช่วงแหล่งที่มาแล้ว
Caligari

2

พบการเปลี่ยนแปลงเล็กน้อยที่ทำงานเพื่อกำจัดช่องว่างจากด้านล่างของตาราง = ดัชนี (G2: G, COUNTIF (G2: G, "<>"))


1

ฉันแปลกใจที่ไม่มีใครเคยให้คำตอบนี้มาก่อน แต่สิ่งนี้ควรจะสั้นที่สุดและยังใช้งานได้ใน excel:

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

G2:G<>""สร้างอาร์เรย์ 1 / true (1) และ 1 / false (0) เนื่องจากLOOKUPวิธีการค้นหาจากบนลงล่าง2และเนื่องจากมันจะไม่พบ 2 มันจะมาถึงแถวสุดท้ายที่ไม่ว่างและให้ตำแหน่งของสิ่งนั้น

วิธีอื่นในการทำเช่นนี้ตามที่คนอื่นอาจกล่าวถึงคือ:

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

ค้นหาMAXimum ROWของแถวที่ไม่ว่างและป้อนให้INDEX

ในอาร์เรย์การหยุดชะงักที่ว่างเปล่าเป็นศูนย์การใช้INDIRECT RCสัญกรณ์COUNTBLANK เป็นอีกทางเลือกหนึ่ง หาก V4: V6 ถูกครอบครองด้วยรายการแสดงว่า

V18 :

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

จะให้ตำแหน่งของ V6


1

เพื่อรับค่าสุดท้ายจากคอลัมน์คุณยังสามารถใช้MAXฟังก์ชันกับIFฟังก์ชัน

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.