2012-06-15 129 views
0

當我使用range.copyTo()方法將範圍從一個電子表格複製到另一個時,我通常會在im指定目標範圍時使用sheet.getLastRow()+1。例如:range.copyTo not working as excpected Apps Script

var oldRange = sheet.getRange(1, 1, 1, sheet.getLastColumn()); 

var newRange = destSheet.getRange(destSheet.getLastRow()+1, 1, 1, sheet.getLastColumn()); 

如果destSheet不具有任何額外的或在底部「空白」的行,該方法range.copyTo()不復制的數據並將其不會引發錯誤消息。如果我使用相同的邏輯並使用.getValues().setValues(),則新行將自動添加到我的目標表中。

我期待range.copyTo()創建額外的行以及如果需要。這是否表現爲excepcted或這是一個錯誤?

回答

3

如果添加.setValue(「」)你newRange聲明,你會看到一個錯誤信息更多的行會被自動添加到目標表數據將被複制。

var newRange = sh.getRange(ss.getLastRow()+1, 1).setValue(''); 
    oldRange.copyTo(newRange) 

無論如何,這是不是真的,因爲最好的解決方法:注意 ,你不應該定義整個dest.range,如the docs

這樣說,只有左上角的單元格是有關錯誤信息(很抱歉,服務器遇到錯誤,請按「確定」刷新工作表。)。我想一個可以合理地認爲這是一個錯誤,你可以在這個here

編輯提出一個問題:其實有一個很好的解決辦法,我沒想到立刻:您可以將CopyTo從之前使用insertRowAfter(ss.getLastRow())()和一切正常。 例如:

var oldRange = sh.getRange(1, 1, 1, ss.getLastColumn()); 
    var newRange = sh.getRange(ss.getLastRow()+1, 1); 
    ss.insertRowAfter(ss.getLastRow()) 
    oldRange.copyTo(newRange) 

當然,如果超過1行需要在必要時重複就像這個例子:

function copyToTest() { 
    var oldRange = sh.getRange(1, 1, 5, ss.getLastColumn());// 5 rows in this example 
    var newRange = sh.getRange(ss.getLastRow()+1, 1); 
    for(n=0;n<oldRange.getLastRow();++n){ss.insertRowAfter(ss.getLastRow())} 
    oldRange.copyTo(newRange) 
} 
+0

我沒有使用你的建議的鏈接把它作爲一個bug。在他們回到那之前,我會用insertRowAfter對它進行編碼。謝謝你的幫助。 –