ฉันมีสเปรดชีตที่มีค่าบางอย่างในคอลัมน์ G บางเซลล์ว่างอยู่ระหว่างนั้นและฉันต้องการรับค่าสุดท้ายจากคอลัมน์นั้นไปยังเซลล์อื่น
สิ่งที่ต้องการ:
=LAST(G2:G9999)
ยกเว้นว่าLAST
ไม่ใช่ฟังก์ชัน
ฉันมีสเปรดชีตที่มีค่าบางอย่างในคอลัมน์ G บางเซลล์ว่างอยู่ระหว่างนั้นและฉันต้องการรับค่าสุดท้ายจากคอลัมน์นั้นไปยังเซลล์อื่น
สิ่งที่ต้องการ:
=LAST(G2:G9999)
ยกเว้นว่าLAST
ไม่ใช่ฟังก์ชัน
คำตอบ:
ดังนั้นโซลูชันนี้จึงใช้สตริงเป็นพารามิเตอร์ พบว่ามีกี่แถวในแผ่นงาน ได้รับค่าทั้งหมดในคอลัมน์ที่ระบุ จะวนซ้ำค่าจากจุดสิ้นสุดไปยังจุดเริ่มต้นจนกว่าจะพบค่าที่ไม่ใช่สตริงว่าง ในที่สุดก็เรียกคืนค่า
สคริปต์:
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()
และบังคับให้ฟังก์ชันเซลล์อัปเดต ฉันไม่พบในเอกสาร
คำตอบที่คล้ายกันสำหรับคำตอบของ caligariแต่เราสามารถจัดระเบียบได้โดยระบุช่วงคอลัมน์ทั้งหมด:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
ช่วงเอ็ดคล้ายกับ@ คำตอบของ
COUNT(G2:G)
ส่งคืนค่า 0 ให้ใช้การCOUNTA(G2:G)
นับเฉพาะจำนวนค่าในชุดข้อมูลแทน COUNTA
จะมีประโยชน์เฉพาะเมื่อรวมกับINDEX
เพื่อรับค่าสุดท้ายหากไม่มีช่องว่างระหว่างค่าของคุณ
COUNTA
ใช้ COUNT
นับเฉพาะค่าตัวเลข: จะส่งกลับ 0 เมื่อกำหนดเช่นเซลล์ข้อความ
อันที่จริงฉันพบวิธีแก้ปัญหาที่ง่ายกว่าที่นี่:
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)))))
ROW
ส่งคืนหมายเลขแถวดังนั้นFILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
ส่งคืนอาร์เรย์ของตัวเลขแถวที่ไม่ว่างทั้งหมด (ไม่ใช่ค่า) เช่น [1,2, 3, 7, 12, 14] จากนั้นMAX
ให้หมายเลขแถวสุดท้ายแก่เรา FILTER
จากนั้นวินาทีจะถูกใช้เพื่อกรองแถวทั้งหมดที่หมายเลขแถวไม่ตรงกับค่าจากMAX
(เช่นค่าของแถวสุดท้ายที่ไม่ว่าง)
ฟังก์ชัน LAST () ไม่ได้ใช้งานในขณะนี้เพื่อเลือกเซลล์สุดท้ายภายในช่วง อย่างไรก็ตามทำตามตัวอย่างของคุณ:
=LAST(G2:G9999)
เราสามารถรับเซลล์สุดท้ายโดยใช้สองฟังก์ชันINDEX ()และCOUNT ()ด้วยวิธีนี้:
=INDEX(G2:G; COUNT(G2:G))
มีตัวอย่างสดที่ spreedsheet ที่ฉันพบ (และแก้ไข) ปัญหาเดียวกัน (แผ่นงานOrzamentos
เซลล์I5
) โปรดทราบว่าสามารถทำงานได้อย่างสมบูรณ์แบบแม้กระทั่งการอ้างถึงแผ่นงานอื่น ๆ ภายในเอกสาร
COUNTA
ในกรณีนั้นได้หากคุณแน่ใจว่าไม่มีช่องว่างระหว่างค่าในคอลัมน์ ดูความคิดเห็นของฉันเพื่อตอบคำถามของ dohmoose
:G
ถึงแสดงถึงองค์ประกอบสุดท้าย? นี่เป็นเอกสารหรือไม่?
=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) )
ในการส่งคืนค่าสุดท้ายจากคอลัมน์ของค่าข้อความคุณต้องใช้ COUNTA ดังนั้นคุณต้องใช้สูตรนี้:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
รวมกับINDEX
จะไม่ส่งคืนค่าสุดท้ายในคอลัมน์
ลองสิ่งนี้:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
สมมติว่าคอลัมน์ที่คุณกำลังมองหาค่าสุดท้ายคือ B
และใช่มันใช้งานได้กับช่องว่าง
ดูเหมือนว่า 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: ฉันจะบังคับให้คำนวณสูตรใหม่ได้อย่างไร
ฉันดูคำตอบก่อนหน้านี้และดูเหมือนว่าพวกเขาทำงานหนักเกินไป บางทีการรองรับการเขียนสคริปต์อาจจะดีขึ้น ฉันคิดว่าฟังก์ชันจะแสดงเช่นนี้:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
ในสเปรดชีตของฉันฉันใช้:
= lastValue(E17:E999)
ในฟังก์ชั่นฉันได้รับอาร์เรย์ของค่าหนึ่งต่อเซลล์ที่อ้างอิงและสิ่งนี้จะวนซ้ำจากท้ายอาร์เรย์ไปข้างหลังจนกว่าจะพบค่าที่ไม่ว่างเปล่าหรือองค์ประกอบหมด ควรตีความการอ้างอิงแผ่นงานก่อนที่ข้อมูลจะถูกส่งไปยังฟังก์ชัน ไม่แฟนซีพอที่จะจัดการกับหลายมิติได้เช่นกัน คำถามถามถึงเซลล์สุดท้ายในคอลัมน์เดียวจึงดูเหมือนจะพอดี มันอาจจะตายถ้าคุณไม่มีข้อมูลด้วย
ไมล์สะสมของคุณอาจแตกต่างกันไป แต่ใช้ได้กับฉัน
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
ไม่มีการเข้ารหัสยาก
อันนี้ใช้ได้กับฉัน:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
สิ่งนี้ได้รับค่าสุดท้ายและจัดการกับค่าว่าง:
=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()))) ) ) )
ในคอลัมน์ที่มีช่องว่างคุณจะได้รับค่าสุดท้ายด้วย
=+sort(G:G,row(G:G)*(G:G<>""),)
คำตอบ
$ =INDEX(G2:G; COUNT(G2:G))
ทำงานไม่ถูกต้องใน LibreOffice อย่างไรก็ตามด้วยการเปลี่ยนแปลงเพียงเล็กน้อยก็ทำงานได้อย่างสมบูรณ์
$ =INDEX(G2:G100000; COUNT(G2:G100000))
จะใช้งานได้เฉพาะเมื่อช่วงที่แท้จริงมีขนาดเล็กกว่า (G2:G10000)
เป็นที่ยอมรับหรือไม่ที่จะตอบคำถามเดิมด้วยคำตอบนอกหัวข้ออย่างเคร่งครัด :) คุณสามารถเขียนสูตรในสเปรดชีตเพื่อทำสิ่งนี้ น่าเกลียดมั้ย? แต่มีประสิทธิภาพในการทำงานปกติของสเปรดชีต
=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
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());
ฉันกำลังเล่นกับรหัสที่ @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)
เกี่ยวกับความคิดเห็นของ @ Jon_Schneider หากคอลัมน์มีเซลล์ว่างให้ใช้COUNTA ()
=INDEX(G2:G; COUNT**A**(G2:G))
ฉันพบวิธีอื่นที่อาจช่วยคุณได้
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- จะกลับมาแถวสุดท้าย
ข้อมูลเพิ่มเติมจาก anab ที่นี่: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
พบการเปลี่ยนแปลงเล็กน้อยที่ทำงานเพื่อกำจัดช่องว่างจากด้านล่างของตาราง = ดัชนี (G2: G, COUNTIF (G2: G, "<>"))
ฉันแปลกใจที่ไม่มีใครเคยให้คำตอบนี้มาก่อน แต่สิ่งนี้ควรจะสั้นที่สุดและยังใช้งานได้ใน 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)
ค้นหาMAX
imum ROW
ของแถวที่ไม่ว่างและป้อนให้INDEX
ในอาร์เรย์การหยุดชะงักที่ว่างเปล่าเป็นศูนย์การใช้INDIRECT
RC
สัญกรณ์COUNTBLANK
เป็นอีกทางเลือกหนึ่ง หาก V4: V6 ถูกครอบครองด้วยรายการแสดงว่า
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
จะให้ตำแหน่งของ V6
เพื่อรับค่าสุดท้ายจากคอลัมน์คุณยังสามารถใช้MAX
ฟังก์ชันกับIF
ฟังก์ชัน
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Tools -> Scripts -> Script editor...