google-apps-script - script教學 - spreadsheetapp google script




選擇列的最後一個值 (14)

我有一個電子表格,其中有一些值在列G中。有些單元格之間為空,我需要將該列中的最後一個值存入另一個單元格。

就像是:

=LAST(G2:G9999)

除了LAST不是一個函數。


概要:

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

但它需要考慮是否要在給定範圍內使用COLUMNSROWS

但是,如果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) )

Google Apps腳本現在支持範圍作為功能參數。 該解決方案接受一個範圍:

// 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腳本幫助論壇中的討論: 如何強制重新計算公式?


在一個空白欄中,你可以得到最後一個值

=+sort(G:G,row(G:G)*(G: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)

查找非空白行的最大行數並將其提供給INDEX

在零空白中斷陣列中,使用帶有COUNTBLANK INDIRECT RC表示法是另一種選擇。 如果V4:V6被條目佔用,那麼,

V18

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

會給V6的位置。



我看了以前的答案,看起來他們工作太辛苦。 也許腳本支持只是簡單的改進。 我認為這個功能是這樣表達的:

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

然後在我的電子表格中使用:

= lastValue(E17:E999)

在函數中,我得到一個數組值,每個引用的單元格有一個值,這只是從數組的末尾向後迭代,直到它找到一個非空值或用完元素。 在將數據傳遞給函數之前,應該先解釋圖紙參考。 不足以處理多維度。 這個問題確實要求單列中的最後一個單元格,所以它似乎很適合。 如果您的數據用完,它可能會死亡。

你的里程可能會有所不同,但這對我有用。


為了從一列文本值中返回最後一個值,你需要使用COUNTA,所以你需要這個公式:

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

用嚴格的主題答案來回答原始問題是否可以接受:)您可以在電子表格中編寫一個公式來執行此操作。 也許醜陋? 但在電子表格的正常操作中有效。

=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中經常以類似的方式工作。


答案

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

在LibreOffice中無法正常工作。 但是,只要稍作改動,它就能完美運作。

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

它只有在真實範圍小於(G2:G10000)


與caligari的答案類似的答案 ,但我們可以通過指定完整的列範圍來整理它:

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

這一個適合我:

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

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

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

沒有硬編碼。







google-spreadsheet