Apps 脚本将多个范围从 1 个工作表复制到另一个电子表格

时间:2021-04-21 15:47:06

标签: google-apps-script google-sheets

我正在尝试将数据从一个电子表格复制到另一个电子表格,我已经成功地实现了我在网上找到的适用于特定范围的东西

function cloneGoogleSheet() {

  // source doc
  var sss = SpreadsheetApp.openById("spreadsheetkey1");

  // source sheet
  var ss = sss.getSheetByName('_tab_name_source');

  // Get full range of data
  var SRange = ss.getRange(7,3,5,1);

  // get A1 notation identifying the range
  var A1Range = SRange.getA1Notation();

  // get the data values in range
  var SData = SRange.getValues();

  // target spreadsheet
  var tss = SpreadsheetApp.openById("spreadsheetkey2");

  // target sheet
  var ts = tss.getSheetByName('tab_name_destination');

  // Clear the Google Sheet before copy
  //ts.clear({contentsOnly: true});

  // set the target range to the values of the source data
  ts.getRange(A1Range).setValues(SData);

};

上面的代码工作得很好,但是我需要复制 18 个不同的范围,我不能只是合并到 1 个范围。我考虑过使用上面的选项,但是对于每个范围“乘”它 18 次,但这似乎是一个非常不雅的解决方案。

我找到了一个有效的解决方案,如果它保留在同一个电子表格中,它就可以工作,因为它使用 copyto 而不是获取/设置值。值部分工作完美,因为它不会与合并单元格格式混淆。过去 2-3 个小时,我一直在努力将下面的工作代码与第一个代码中的元素合并以制作一个工作脚本。

function test () {
  try {
    var spread = SpreadsheetApp.openById("spreadsheetkey");
    var sheet = spread.getSheetByName("tab_name_source");
    var rlist = sheet.getRangeList(["c7:c11", "g7:g11", "k7:k11"]);
    sheet = spread.getSheetByName("tab_name_destination");
    for( var i=0; i<rlist.getRanges().length; i++ ) {
      var r1 = rlist.getRanges()[i];
      var r2 = sheet.getRange(r1.getA1Notation());
     
      r1.copyto(r2);
    }
  }
  catch(err) {
    Logger.log(err);
  }
}

我最初尝试将第二段代码调整为使用 setvalues,但是我未能在此代码范围内成功实现 getvalues 部分。我想一旦我得到这段代码使用 get 和 set values 而不是 Copyto 我只需要添加另一个电子表格的电子表格 ID 即可获得最终结果

1 个答案:

答案 0 :(得分:1)

试试这个:

function myFunction() {
  var sourceSS = SpreadsheetApp.getActiveSpreadsheet();
  var sourceSheet = sourceSS.getSheetByName("sheetname");
  var targetSS = SpreadsheetApp.openById("spreadsheet id here");
  var targetSheet = targetSS.getSheetByName("Sheet1");

  var ranges = ["C7:C11", "G7:G11", "K7:K11"];
  ranges.forEach(range => {
    var data = sourceSheet.getRange(range).getValues();
    targetSheet.getRange(range).setValues(data);
  })
}

源表:

enter image description here

目的地表:

enter image description here

参考: