google-apps-script script教學 - 選擇列的最後一個值




spreadsheet pricing (17)

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

就像是:

=LAST(G2:G9999)

除了LAST不是一個函數。


Answers

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

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

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

=+sort(G:G,row(G:G)*(G: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中經常以類似的方式工作。



關於@ Jon_Schneider的評論,如果該列有空白單元格,只需使用COUNTA()

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

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

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

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

沒有硬編碼。



我很驚訝沒有人曾經給出過這個答案。 但是這應該是最短的,甚至可以在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的位置。


試試這個: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

假設你正在尋找最後一個值的列是B.

是的,它適用於空白。


這一個適合我:

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

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)

這將獲取最後一個值並處理空值:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )

答案

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

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

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

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


目前沒有執行LAST()函數來選擇範圍內的最後一個單元格。 但是,按照您的示例:

=LAST(G2:G9999)

我們可以通過這種方式使用函數INDEX()COUNT()來獲得最後一個單元格:

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

在spreedsheet中有一個實例 ,我發現(並解決了)同樣的問題(表單Orzamentos ,單元格I5 )。 請注意,它甚至可以引用文檔中的其他表單。


2017更新:使用Stackdriver Logging for Google Apps Script調試Event對象 。 從腳本編輯器的菜單欄中,轉到: View > Stackdriver Logging以查看或流式傳輸日誌。

console.log()將編寫DEBUG級別消息

示例onEdit()

function onEdit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    range:  e.range.getA1Notation(),    
    source:  e.source.getId(),
    user:  e.user,   
    value:  e.value,
    oldValue: e. oldValue
  }

  console.log({message: 'onEdit() Event Object', eventObject: debug_e});
}

示例onFormSubmit()

function onFormSubmit (e) {
  var debug_e = {
    authMode:  e.authMode,  
    namedValues: e.namedValues,
    range:  e.range.getA1Notation(),
    value:  e.value
  }

  console.log({message: 'onFormSubmit() Event Object', eventObject: debug_e});
}

示例onChange()

function onChange (e) {
  var debug_e = {
    authMode:  e.authMode,  
    changeType: changeType,
    user:  e.user
  }

  console.log({message: 'onChange() Event Object', eventObject: debug_e});
}

然後檢查Stackdriver UI中標記為message字符串的日誌以查看輸出





google-apps-script google-spreadsheet