复制一个电子表格上的完整列表,以附加在另一个电子表格的底部

时间:2013-04-16 18:37:12

标签: google-apps-script google-sheets

在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 );
}

知道如何才能让它发挥作用吗?

2 个答案:

答案 0 :(得分:4)

正如您所发现的那样,copyValuesToRange()是一个Range method,会影响Sheet Object与范围相同的Spreadsheet Object。没有一种原子方法可以将一系列值复制到另一个电子表格中,但是有很多方法可以实现。

这是一种方式。

  • 从源表中,通过使用getDataRange()选择完整的数据范围,然后使用getValues()将所有值捕获到javascript数组中,在一个操作中获取所有数据。
  • 要忽略第一行标题,请使用javascript array method 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);
}

答案 1 :(得分:0)

对于我通过导入和追加数据创建的某些历史仪表板,我使用了一个名为Sheetgo的附加组件。节省编程时间并帮助我解决可追溯性问题。