【问题标题】:Google Apps Script, copy one spreadsheet to another spreadsheet with formattingGoogle Apps 脚本,将一个电子表格复制到另一个带格式的电子表格
【发布时间】:2013-11-16 10:53:01
【问题描述】:

希望这个问题尚未得到解答。我花了相当多的时间搜索,虽然我找到了类似的帖子,但没有一个完全符合我的要求。

我想使用 Google Apps 脚本将单个工作表从 Google 电子表格复制到另一个 Google 电子表格,并且我想保留格式(包括合并的单元格)。有没有办法做到这一点?我尝试了以下功能:

复制到() 复制格式到范围()

但这些方法仅适用于同一个电子表格,并且不允许在不同电子表格之间复制数据。有没有人有什么建议?谢谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    你看过这里吗:

    https://developers.google.com/apps-script/reference/spreadsheet/sheet#copyTo(Spreadsheet)

    copyTo(电子表格)

    将工作表复制到另一个电子表格。目标电子表格可以是源。新电子表格的名称为“[原始电子表格名称]的副本”。

     var source = SpreadsheetApp.getActiveSpreadsheet();
    
     var sheet = source.getSheets()[0];
    
     var destination = SpreadsheetApp.openById("ID_GOES HERE");
    
     sheet.copyTo(destination);
    

    【讨论】:

    • 不幸的是,方法 copyTo() 不会复制格式,或者至少不会合并单元格。此外,我需要在接下来的几个月内多次调用此副本,并且我不希望每次制作副本时都在目标电子表格中添加新工作表。我希望每次都将数据从源电子表格复制到同一个目标电子表格中。另外,我不相信 copyTo() 允许您在电子表格之间复制,只能在单个电子表格中的工作表之间复制。
    • 我刚刚测试了代码,它可以工作。 (1) copyTo() 复制格式,包括合并的单元格;(2) 它在电子表格之间工作(参见代码中以“var destination =”开头的行)。要消除多个电子表格问题,您可以编写脚本,以便删除旧工作表,复制新工作表,然后重命名新工作表。每次都需要将数据复制到同一个目标电子表格中是否有特定原因?
    • 啊哈!我检查了我的代码,并且我的 openById() 方法中的目标电子表格 ID 错误。精彩的!太感谢了!关于我为什么需要这样做:我有多个用户向我提交表单。然后,我按用户将订单分成单独的表格,并添加其他信息。最后一步是将这些单独的用户工作表从主电子表格复制到他们自己的单独电子表格中,只有他们可以访问。
    • 它将引用复制到新的电子表格...有没有办法只复制值?
    • 仅复制值 - range.copyValuesToRange()
    【解决方案2】:

    如果您想复制特定电子表格的工作表,您可以使用:

    SpreadsheetApp.getActiveSpreadsheet().duplicateActiveSheet();

    这将创建您当前工作表的副本并将该副本设为活动状态。

    duplicateActiveSheet()

    继续编写脚本 :)

    【讨论】:

      【解决方案3】:

      如果有人只想复制特定工作表中特定范围的格式

         /**
           copying full formatting including sizez and merging from one range to new location
      https://stackoverflow.com/questions/25106580/copy-value-and-format-from-a-sheet-to-a-new-google-spreadsheet-document
      below first coordinates of original range we want to copy and then cooridinaes of the begining of the place ino which we want to copy our range
          @param startColumnOfOriginal {Number} 
           @param startRowOfOriginal {Number} 
           @param numberOfRows {Number} 
           @param numberOfColumns {Number} 
           
           @param startColumnOfTarget {Number} 
           @param startRowOfTarget {Number} 
         
           @param sheetOfOrigin {Sheet} sheet object of where our source is
           @param sheetOfTarget {Sheet} sheet object where we want to copy it
           */
           
           function copyFullFormatting(startRowOfOriginal,startColumnOfOriginal,numberOfRows
           ,numberOfColumns, startRowOfTarget, startColumnOfTarget,  sheetOfOrigin, sheetOfTarget
           ){
           const sourceRange = sheetOfOrigin.getRange(
           startRowOfOriginal, startColumnOfOriginal, numberOfRows, numberOfColumns)
           
           const targetRange = sheetOfTarget.getRange(
           startRowOfTarget, startColumnOfTarget, numberOfRows, numberOfColumns)
           sourceRange.copyFormatToRange(sheetOfTarget,startColumnOfOriginal, startColumnOfTarget+ numberOfColumns, startRowOfTarget, startRowOfTarget+numberOfRows )
           //iterating over rows of source range
           for(var rowNumb=startRowOfOriginal;rowNumb<startRowOfOriginal+numberOfRows;rowNumb++  ){
           const targetRowNumb = rowNumb-startRowOfOriginal+startRowOfTarget
           sheetOfTarget.setRowHeight(targetRowNumb, sheetOfOrigin.getRowHeight(rowNumb))  
           }
           
           // iterating over columns in target range
           for (var colNumb=startColumnOfOriginal;colNumb<startColumnOfOriginal+numberOfColumns;colNumb++  ){
           const targetColNumb = colNumb-startColumnOfOriginal+startColumnOfTarget
           sheetOfTarget.setColumnWidth(targetColNumb, sheetOfOrigin.getColumnWidth(colNumb))
      
           }
           
           
           
           }
      

      【讨论】:

        【解决方案4】:

        试试这个功能。

        CopyTable("sda12wrsdsdaada121", "sheetA", "sheetB", "A1:D200")
        
        /**
         * Copy data and formatting from source to destination
         * @param {string} srcId id of source
         * @param {string} srcSheetName sheet's name of source
         * @param {string} destSheetName sheet's name of destination
         * @param {string} copyRange A1Notation of range
         */
        function CopyTable(srcId, srcSheetName, destSheetName, copyRange){
        
          var srcSpreadSheet = SpreadsheetApp.openById(srcId);
          var srcSheet = srcSpreadSheet.getSheetByName(srcSheetName);
        
          var destSpreadSheet = SpreadsheetApp.getActiveSpreadsheet();
          var destSheet = destSpreadSheet.getSheetByName(destSheetName);
          destSheet.clear();
        
          var srcRange = srcSheet.getRange(copyRange); 
        
          var values = srcRange.getValues();
          var background = srcRange.getBackgrounds();
          var fontColor = srcRange.getFontColors();
          var fontFamily = srcRange.getFontFamilies();
          var fontLine = srcRange.getFontLines();
          var fontSize = srcRange.getFontSizes();
          var fontStyle = srcRange.getFontStyles();
          var fontWeight = srcRange.getFontWeights();
          var textStyle = srcRange.getTextStyles();
          var horAlign = srcRange.getHorizontalAlignments();
          var vertAlign = srcRange.getVerticalAlignments();
          var bandings = srcRange.getBandings();
          var mergedRanges = srcRange.getMergedRanges();
        
          var destRange = destSheet.getRange(copyRange);
         
          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.setTextStyles(textStyle);
          destRange.setHorizontalAlignments(horAlign);
          destRange.setVerticalAlignments(vertAlign);
          
          for (let i in bandings){
            let srcBandA1 = bandings[i].getRange().getA1Notation();
            let destBandRange = destSheet.getRange(srcBandA1);
        
            destBandRange.applyRowBanding()
            .setFirstRowColor(bandings[i].getFirstRowColor())
            .setSecondRowColor(bandings[i].getSecondRowColor())
            .setHeaderRowColor(bandings[i].getHeaderRowColor())
            .setFooterRowColor(bandings[i].getFooterRowColor());
          }
        
          for (let i = 0; i < mergedRanges.length; i++) {
            destSheet.getRange(mergedRanges[i].getA1Notation()).merge();
          }
         
          for (let i = 1; i <= srcRange.getHeight(); i++) {
            let width = srcSheet.getColumnWidth(i);
            destSheet.setColumnWidth(i, width);
          }
         
          for (let i = 1; i <= srcRange.getWidth(); i++){
            let height = srcSheet.getRowHeight(i);
            destSheet.setRowHeight(i, height);
          }
        }
        

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-27
        • 2020-05-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 1970-01-01
        相关资源
        最近更新 更多