首页 > 解决方案 > Google App Script - 在 2 个电子表格之间导入所有范围格式

问题描述

更新:我写了 for 循环来修复合并的单元格和列宽问题。只是需要一些边界方面的帮助!

我正在将一系列单元格从一个 Google 电子表格复制到另一个 Google 电子表格。困难的部分是我试图保持所有格式。到目前为止,我已经能够保留所有格式,除了 3 项:单元格边框、各种合并的单元格和列宽。任何帮助将不胜感激。提前抱歉,昨天才发现Google App Script,我以前从未使用过JS。

function importTable() {

  // Source spreadsheet
  var srcSpreadSheet = SpreadsheetApp.openById("SpreadSheet-ID");
  var scrSheet = srcSpreadSheet.setActiveSheet(srcSpreadSheet.getSheetByName("Sheet1"));

  // Destination spreadsheet
  var destSpreadSheet = SpreadsheetApp.openById("SpreadSheet-ID");
  var destSheet = destSpreadSheet.setActiveSheet(destSpreadSheet.getSheetByName("Test"));
  destSheet.clear();

  // Get data and formatting from the source sheet
  var range = scrSheet.getRange(1, 2, 24, 16);

  var values = range.getValues();
  var background = range.getBackgrounds();
  var banding = range.getBandings();
  var mergedRanges = range.getMergedRanges();
  var fontColor = range.getFontColors();
  var fontFamily = range.getFontFamilies();
  var fontLine = range.getFontLines();
  var fontSize = range.getFontSizes();
  var fontStyle = range.getFontStyles();
  var fontWeight = range.getFontWeights();
  var horAlign = range.getHorizontalAlignments();
  var textStyle = range.getTextStyles();
  var vertAlign = range.getVerticalAlignments();

  // Put data and formatting in the destination sheet
  var destRange = destSheet.getRange(1, 2, 24, 16);

  destRange.setValues(values);
  destRange.setBackgrounds(background);
  destRange.setFontColors(fontColor);
  destRange.setFontFamilies(fontFamily);
  destRange.setFontLines(fontLine);
  destRange.setFontSizes(fontSize);
  destRange.setFontStyles(fontStyle);
  destRange.setFontWeights(fontWeight);
  destRange.setHorizontalAlignments(horAlign);
  destRange.setTextStyles(textStyle);
  destRange.setVerticalAlignments(vertAlign);

    // Iterate through to put merged ranges in place
  for (var i = 0; i < mergedRanges.length; i++) {
    destSheet.getRange(mergedRanges[i].getA1Notation()).merge();
  }

  // Iterate through to get the column width of the source destination
  for (var i = 1; i < 18; i++) {
    var width = scrSheet.getColumnWidth(i);
    destSheet.setColumnWidth(i, width);
  }

  // Iterate through to get the row heighth of the source destination
  for (var i = 1; i < 27; i++){
    var height = scrSheet.getRowHeight(i);
    destSheet.setRowHeight(i, height);
  }

}

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


这个解决方法怎么样?在此解决方法中,使用了 Class Sheet 的 copyTo() 和 Class Range 的 copyTo()。我认为您的情况有几个答案。因此,请将此视为其中之一。

该脚本的流程如下。

  1. 使用 Class Sheet 的 copyTo() 复制包含要作为模板复制的范围的工作表。
  2. 使用 Class Range 的 copyTo() 将值、公式、格式和合并从复制的工作表复制到目标工作表。
    • 此时,使用您要复制的范围。
  3. 使用 Class Range 的 copyTo() 将列宽从复制的工作表复制到目标工作表。
  4. 删除模板表。

示例脚本:

function importTable2() {
  // Source
  var sourceSheet = SpreadsheetApp.openById("SpreadSheet-ID").getSheetByName("Sheet1");
  var sourceRange = sourceSheet.getRange(1, 2, 24, 16);

  // Destination
  var destSS = SpreadsheetApp.openById("SpreadSheet-ID");
  var destSheet = destSS.getSheetByName("Test");
  var destRange = destSheet.getRange(1, 2, 24, 16);
  destSheet.clear();

  // Copy
  var copiedsheet = sourceRange.getSheet().copyTo(destSS);
  copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange);
  copiedsheet.getRange(sourceRange.getA1Notation()).copyTo(destRange, SpreadsheetApp.CopyPasteType.PASTE_COLUMN_WIDTHS, false);
  destSS.deleteSheet(copiedsheet);
}

笔记 :

  • 在运行此脚本之前,请设置SpreadSheet-ID.

参考 :

如果我误解了你的问题,请告诉我。我想修改它。


推荐阅读