【问题标题】:Is there a better way to make a copy of a spreadsheet with content only?有没有更好的方法来制作仅包含内容的电子表格副本?
【发布时间】:2023-04-03 10:52:01
【问题描述】:

我一直在尝试仅将电子表格的内容(没有公式,例如 =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]);
  }
}

据我所知,这提供了预期的结果,但它似乎是一种非常迂回的做事方式,我希望有人能够指出我更有效或更直接的方法。

感谢您的帮助

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案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());    
      }
    

    【讨论】:

    • 很好的解决方案,但仅供参考,您也可以对范围使用 CopyTo() 方法,而不是工作表,不同之处在于,对于范围,您可以将选项设置为 {contentsOnly:true}。对于大数据范围,此方法可能比使用 setValues()getValues() 更快。 developers.google.com/apps-script/reference/spreadsheet/…
    • 当我尝试使用 spreadsheet.getSheets()[i].getDataRange().copyTo(newSpreadsheet.getSheets()[i], {contentsOnly:true}); 代替 if 语句中的当前内容时,我收到此错误:Cannot find method copyTo(Sheet,object). at copySpreadsheetContent(Savely:158)
    • 您需要指定目标范围。此外,不幸的是,您只能使用此方法将数据从一张工作表复制到同一电子表格中的另一张工作表。如果您需要在同一个电子表格中创建新电子表格而不是新工作表,则必须坚持使用 getValues() 和 setValues() 仅用于复制内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2012-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多