1

Google スプレッドシートでは、あるスプレッドシートの完全なリストから値のみを取得し、それを別のスプレッドシートのリストの最後に追加したいと考えています。私の問題は、copyValuesToRange()関数を使用すると次のエラーが発生することです。

Target sheet and source range must be on the same spreadsheet.

これが私の現在のコードです:

function transferList() {
  var source = SpreadsheetApp.getActiveSpreadsheet();
  var target = SpreadsheetApp.openById("0ABCD"); 
  var target_sheet = target.getSheetByName("RFPData");
  var sheet = source.getSheetByName("RFP List");
  var sheet_last_row = sheet.getLastRow() + 1;
  var source_range = sheet.getRange("A2:I"+sheet_last_row);
  var sWidth=source_range.getWidth() + 1;
  var sHeight=source_range.getHeight() + 1;
  var last_row=target_sheet.getLastRow();
  source_range.copyValuesToRange(target_sheet , 1, sWidth, 
    last_row + 1, last_row + sHeight );
}

どうすればこれを機能させることができますか?

4

2 に答える 2

4

おわかりのように、Rangeと同じSpreadsheet Object内にあるSheet Objectに影響を与えるcopyValuesToRange()Rangeメソッドです。値の範囲を別のスプレッドシートにコピーするアトミックな方法はありませんが、それを行う方法はいくつかあります。

これが1つの方法です。

  • ソース シートから、1 回の操作ですべてのデータを取得しgetDataRange()ますgetValues()
  • ヘッダーの最初の行を無視するには、javascript 配列メソッドsplice()を使用します。
  • を使用して、現在そこにあるデータの最後の行の後から、ターゲット シートにある宛先を見つけますgetLastRow()
  • を使用して、ソース データ (ヘッダーなし) を次の行から宛先シートに書き込みますsetValues()

脚本:

function transferList() {
  var sourceSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("RFP List");
  var sourceData = sourceSheet.getDataRange().getValues();
  sourceData.splice(0,1);  // Remove header
  var targetSS = SpreadsheetApp.openById("0ABCD").getSheetByName("RFPData");
  var targetRangeTop = targetSS.getLastRow(); // Get # rows currently in target
  targetSS.getRange(targetRangeTop+1,1,sourceData.length,sourceData[0].length).setValues(sourceData);
}
于 2013-04-16T20:49:31.280 に答える