2

I had success filling a single column (A) with the value found in range 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)

So then I thought I was on easy-street, and I tried to modify/apply that to a larger range by filling a multi-column range with the values found in range 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)

Apparently there is a bit more to this than simply slapping an "S" onto the end of the word "Value".

The error reads as follows:

Incorrect range height, was 1 but should be 10

(FYI: var lastRow = 11)

Btw, I get no error if I use Value instead of Values, although I end up with cells full of the value found only in range C1.

So I'm close.... or way off. One of those.

Help???

4

2 に答える 2

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 last Row を 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]]。配列 (インデックス 1)。したがって、最初の配列の値を取得したい場合は、次のように記述する必要があります。value = arrayName[0]これにより、1 次元配列が返されます。これ[data1,data2,data3]は、rowData を取得するために使用したものです。

ここで、新しいデータをスプレッドシートの範囲に書き戻すことができるように、2 次元配列を再度取得する必要があります。そのため、新しい配列を作成し (var newData=[]またはvar newData = new Array()まったく同じことを行い)、for ループでこの新しい配列に rowData 配列を追加します...結果は配列の配列になります。これが実際に探していたものであり、これを 1 つのsetValuesステートメントでシートに直接書き込むことができます。

于 2013-04-17T22:52:19.477 に答える