0

)メソッドを使用してrange.copyTo(あるスプレッドシートから別のスプレッドシートに範囲をコピーする場合、通常sheet.getLastRow()+1、宛先範囲を指定するときに使用します。例:

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

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

destSheetの下部に追加の行または「空白」の行がない場合、range.copyTo()メソッドはデータをコピーせず、エラーメッセージをスローしません。これと同じロジックを使用してandを使用する.getValues().setValues()、新しい行が自動的にdestSheetに追加されます。

range.copyTo()必要に応じて、追加の行も作成することを期待していました。これは例外として機能していますか、それともバグですか?

4

1 に答える 1

3

.setValue ('') を newRange ステートメントに追加すると、エラー メッセージが表示 れ、行がコピー先シートに自動的に追加され、データがコピーされます。dest.range全体を定義するべきではないことに注意してください。ドキュメントで述べられているように、左上のセルのみが関連しています

このような :

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

とにかく、これはエラー メッセージ (申し訳ありません。サーバーでエラーが発生しました。[OK] を押してシートを更新してください。) のため、最善の回避策ではありません。これはバグであると合理的に考えることができると思います。ここで問題を提起することができます

編集:実際には、私がすぐに思いつかなかった素晴らしい回避策があります: insertRowAfter(ss.getLastRow())copyTo() の前に使用でき、すべて正常に動作します。例 :

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

もちろん、複数の行が必要な場合は、次の例のように必要に応じて繰り返します。

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)
}
于 2012-06-15T19:25:39.777 に答える