2013-04-17 46 views
2

我已經成功填補了單柱(A),在範圍A1中發現的價值...填寫一個範圍(多列)跌多行 - 谷歌應用程序腳本

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var lastRow = ss.getDataRange().getNumRows(); 
    var rngVal = ss.getRange("A1").getValue() 
    ss.getRange("A2:A"+lastRow).setValue(rngVal) 

於是我想我當時就容易街道上,我試圖修改/應用,爲更大範圍內填充多列範圍,在範圍C1中的值:H1 ...

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var lastRow = ss.getDataRange().getNumRows(); 
    var rngVal = ss.getRange("C1:H1").getValues() 
    ss.getRange("C2:H"+lastRow).setValues(rngVal) 

顯然有一點除了簡單地將「S」放在單詞「Value」的末尾之外。

該錯誤的內容如下:

不正確的範圍內的高度,是1,但應爲10

(供參考:VAR LASTROW = 11)

順便說一句,我沒有錯誤如果我用價值而不是價值 s,雖然我最終的單元格充滿了只在範圍C1中找到的值。

所以我很接近....或者離開。其中一個。

幫助???

回答

3

錯誤消息非常明確......數組的大小必須適合getValues和setValues中的範圍。嘗試像這樣 :

function myFunction() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var lastRow = ss.getLastRow() 
    var rngVal = ss.getRange("C1:H"+lastRow).getValues();// get an array of 10 "rows" and 6 "columns" 
    ss.getRange("C2:H"+(lastRow+1)).setValues(rngVal);//write back this array to a range that has the same size. (starting from Row2 it must ends on lastRow+1 to keep the same number of "rows" 
} 

此功能將轉移範圍C1:H最後一排C2:H LASTROW + 1,不知道這是非常有用的,但這裏不是重點;-)


編輯:對不起,我不明白究竟你的要求......這裏是從C1複製數據的代碼:以下H1在所有行下面

function myFunction() { 
    var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var lastRow = ss.getLastRow() 
    var rngVal = ss.getRange("C1:H1").getValues();// get an array of the first row 
    var rowData = rngVal[0] 
    var newData = [] 
    for(n=1;n<lastRow;++n){newData.push(rowData)} 
    ss.getRange("C2:H"+lastRow).setValues(newData);//write back this array to a range that has the same size. (starting from Row2 it must ends on lastRow+1 to keep the same number of "rows" 
} 

EDIT2您評論如下:

解釋一個字:

當使用range.getValues()我們得到一個2名維陣列,這意味着可被表示爲如下數組的數組:[[data1,data2,data3],[data4,data5,data6]] DATA1,2 & 3是值第一個數組(索引0)的數據和第二個數組(索引1)的數據是第二個數組的值。所以,如果你想獲得第一個數組中的值,你必須這樣寫:value = arrayName[0],這將返回一維數組[data1,data2,data3],這就是我用來獲取rowData。

現在我們需要再次獲取2維數組,以便能夠將新數據寫回到電子表格中的範圍。因此,我們創建一個新的數組(var newData=[]var newData = new Array()的確如此),並且在for循環中我們將rowData數組添加到這個新數組中......結果將是一個數組數組,這實際上就是我們要找的我們可以直接在一張setValues聲明中將其寫入表單。

+0

我想他正試圖做的是填寫一個排一個與下面的值一行的所有行。 – ScampMichael

+0

是的,ScampMichael是正確的。我試圖複製第一個代碼示例,它填充了列A中的範圍。我試圖對C:H的多列範圍執行相同的操作。我可以逐欄完成,但這只是一個解決方法。 – 5th4x4

+0

...或者它可能不是解決方法。也許它需要這樣構建(??) – 5th4x4

0

好吧,這似乎做...

var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1"); 
    var lastRow = ss.getLastRow() 
    var rngVal = ss.getRange("C1:H1").getValues() 
    for (var x=1; x<=lastRow; x++) { 
    ss.getRange("C"+x+":H"+x).setValues(rngVal); 
+0

是的,但你應該避免寫入循環中的表格......它會變得很慢,你有很多行。 cede我建議在我的編輯在陣列級別,並與setValues寫回一步.. –

+0

我當然想要我的編碼習慣陣列級解決方案,所以謝謝你提供的解決方案。我想知道你是否可以協助我在理解這些行中的一部分:'var rowData = rngVal [0]'和'var newData = []'以及For例程的後半部分'{newData.push(rowData)}'。其他人在一起,所以理解這3條線對我前進將證明是非常寶貴的。再次感謝! – 5th4x4

+0

嗨,我添加了幾句話解釋,希望我很清楚:)如果不是,不要猶豫再問一次。 –

相關問題