【问题标题】:Copy a complete list on one spreadsheet to append on the bottom of another spreadsheet复制一个电子表格上的完整列表以附加到另一个电子表格的底部
【发布时间】:2017-05-20 00:25:01
【问题描述】:

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

知道如何让它工作吗?

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    正如您所发现的,copyValuesToRange() 是一个 Range method,它会影响与 Range 位于同一 Spreadsheet ObjectSheet 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);
    }
    

    【讨论】:

    • 该函数正在传输标题行,但没有数据。
    • 很好 - 我尝试使用拼接进行链接,这会产生 removed 行而不是 remainder。现已修复。
    • 玩得很好,实际上它的代码也比我预期的要短得多。谢谢!
    • +Mogsdad,关于“没有一种原子方法可以将一系列值复制到另一个电子表格”......如果原子性很重要,appendRow() 可以提供吗?但是,当然,它一次只能执行一行。
    • @AdamL - copyValuesToRange 无需循环或中间存储即可工作。我就是这么想的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2010-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      • 1970-01-01
      • 1970-01-01
      • 2021-05-08
      相关资源
      最近更新 更多