有没有更好的方法来复制仅包含内容的电子表格?

时间:2019-08-01 12:48:18

标签: google-apps-script google-sheets

我一直试图仅将电子表格的内容(没有等式,例如= IMPORTRANGE)复制到新的电子表格中。我找到了解决方案,但是我想知道是否有更简单的方法来做到这一点?

我最终遍历原始电子表格中的每个工作表,获取每个工作表的数据范围,获取这些值,使用.copyTo将每个工作表复制到新电子表格中,删除使用新电子表格创建的“ Sheet1”,然后遍历新电子表格并将值粘贴到电子表格中的每个新工作表。

function copySpreadsheetContent() {
  var ss1 = SpreadsheetApp.getActiveSpreadsheet();
  var sheetNums = ss1.getNumSheets();
  var ssNew = SpreadsheetApp.create('Test Spreadsheet').getId();
  var ss2 = SpreadsheetApp.openById(ssNew);
  var ss2Nums = ss2.getNumSheets();
  var sheetVals = [];
  for(var i = 0; i < sheetNums; i++){
    var sheet = ss1.getSheets()[i];
    sheetVals[i] = sheet.getDataRange().getValues();
    var newSheet = sheet.copyTo(ss2);
    newSheet.setName(sheet.getName());
  }
  var sheet1 = ss2.getSheetByName("Sheet1");
  ss2.deleteSheet(sheet1);
  for(var j = 0; j <= ss2Nums; j++){
    var ss2Sheet = ss2.getSheets()[j];
    ss2Sheet.getDataRange().setValues(sheetVals[j]);
  }
}

据我所知,这提供了理想的结果,但是这似乎是一种真正的round回做事方式,我希望有人可以向我指出一种更有效或更直接的方法。

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

我的同事最终发现了一个更好的方法,可以通过单个for循环并将其发送到驱动器中的文件夹中

var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var destFolder = DriveApp.getFoldersByName("Experiments").next();
  var file = DriveApp.getFileById(spreadsheet.getId()).makeCopy("Saved Copy", destFolder);
  var newSpreadsheet = SpreadsheetApp.open(file);

  for(var i = 0; i < spreadsheet.getNumSheets(); i++){
    newSpreadsheet.getSheets()[i].getDataRange().setValues(spreadsheet.getSheets()[i].getDataRange().getValues());    
  }