2012-06-04 43 views
0

我有getLastRow()問題。我認爲這個函數應該返回有數據的最後一行。但是,由於我正在處理的工作表在填充數據的行下面有更多的空行,函數似乎進入並選擇最後一行的空行而不是選擇最後一行有數據,這可能不會是相同的。有人能告訴我如何解決這個異常。這是谷歌腳本錯誤還是我不清楚該怎麼辦?如果我沒有說清楚,請進一步詢問。問題與getLastRow()

回答

6

工作表中是否有任何「整列」公式?數組公式或者一直被複制的公式?即使這些公式旨在將空白單元格返回底部,getLastRow()仍然會捕獲它們。

如果是這種情況,請嘗試:

function getLastPopulatedRow(sheet) { 
    var data = sheet.getDataRange().getValues(); 
    for (var i = data.length-1; i > 0; i--) { 
    for (var j = 0; j < data[0].length; j++) { 
     if (data[i][j]) return i+1; 
    } 
    } 
    return 0; // or 1 depending on your needs 
} 
+0

嗯,我想,當我做sheet.getLastRow(),它實際上抓住電子表格的最後一行,即使它是未填充的。我想在這裏做的實際上是獲取電子表格的「最後一個填充行」。現在我可以將活動範圍設置爲電子表格的填充部分。但由於工作表會不時被填充,我將不得不動態確定這個填充範圍。那麼我該怎麼做才能動態確定工作表中最後一個填充行。 –

+0

我很抱歉,我還沒有把你的評論標記爲答案。 –

+0

<<我還沒有把你的評論標記爲答案>>哈哈沒問題。從你的評論中,我認爲你可能會一直使用公式。在這種情況下,請嘗試編輯答案中的功能。 – AdamL

0

更簡單的方法是

var lastRow = sheet.getDataRange().getValues().length ; 
+1

Srik,如果我將它輸入到一個空白表的A1:'= ArrayFormula(IF(ROW(B:B)<11;「This is row」&ROW(B:B); IFERROR(1/0)))'' ,我仍然使用你的方法得到工作表中的總行數。 – AdamL

+0

通過在列B上創建ArrayFormula,您正在填充整個列B(儘管爲空白)。所以,getDataRange()會將這個因素考慮在內,並給你行數。 – Srik

-1

,而亞當斯的解決方案將與一些調整工作,我所遇到的另一個解決這個問題的一些搜索。我看到了一個應該找到第一個空行的代碼,我想我可以簡單地返回第一個空行後面的行來獲取最後一個填充行。我附上代碼在這裏:

function getLastPopulatedRow(sheet) { 
    var cell = sheet.getRange('a1'); 
    var ct = 0; 
    while (cell.offset(ct, 0).getValue() != "") { 
    ct++; 
    } 
    return (ct--); 
} 
+0

這涉及更少的循環迭代,也避免了嵌套循環,所以我相信它應該比以前的解決方案更快。 –

+0

是的,但它看起來沒有其他地方比亞列A.亞當的解決方案是掃描整個表。沒有腳本中的奇蹟;-) –

+0

另外,我想知道這種迭代方法的性能 - 可能會調用大量的'getValues()'。 – AdamL