【问题标题】:How to SetValues to a range with a different dimension如何将值设置为具有不同维度的范围
【发布时间】:2021-02-20 21:33:50
【问题描述】:

我需要准备一张空工作表,以设置为 SetValues 的大小。

详情

我正在尝试使用 clueless 中的 this nice routine 来制作包含所有选项卡的 google 工作表文件的仅值副本。 (最终我会按计划运行它并将其下载到 Microsoft 云驱动器,以便我可以从 Power BI 实时访问)。 Clueless 使用硬编码参数 TL 和 BR 来表示范围的左上角和右下角。 Clueless 首先删除目标工作表中具有匹配名称的任何选项卡,从而从一个新选项卡开始。

不幸的是,我的源工作表选项卡的范围并不完全一致。有些比 TL BL 大,有些比 TL 小。因此,如果我增加或减少 TL 和 BL 全局变量,我会收到“...超出范围...”错误或“数据中的行数与范围内的行数不匹配。” p>

我该如何解决这个问题?有没有办法在 SetValues 之前准备目标工作表,方法是在执行 SetValues 之前使其大小与源工作表 GetDataRange 大小匹配?

谢谢!

    function update_view(dup_id="<spreadsheet_id>", TL="A1", BR="BE900") {
    // Open current Sheet
    var ss = SpreadsheetApp.getActiveSpreadsheet()
    // Supply a duplicate google doc ID. This document will be exported to excel
    var ds = SpreadsheetApp.openById(dup_id)
    // UI element for notifying in the google sheets
    var ui = SpreadsheetApp.getUi()
    //Copy each sheet one by one
    var sheets = ss.getSheets();
    for (i=0; i<sheets.length; i++) {
        src_sheet = sheets[i];
        sheet_name = src_sheet.getName();
        Logger.log(sheet_name);
        // If same sheet exists in the destination delete it and create an empty one
        dst_sheet = ds.getSheetByName(sheet_name);
        if (dst_sheet != null) {
            ds.deleteSheet(dst_sheet)
        }
        dst_sheet = ds.insertSheet(sheet_name);
        //set column width correctly
        for(j=1; j<=src_sheet.getLastColumn(); j++){
            dst_sheet.setColumnWidth(j, src_sheet.getColumnWidth(j))
        }
        src_range = src_sheet.getRange(TL + ":" + BR);
        dst_range = dst_sheet.getRange(TL + ":" + BR);
        //Note: DisplayValues is set as Values, formulas are removed in dup sheet
        dst_range.setValues(src_range.getDisplayValues());
        //Nice to haves for formatting
        dst_range.setFontColors(src_range.getFontColors());
        dst_range.setFontStyles(src_range.getFontStyles());
        dst_range.setBackgrounds(src_range.getBackgrounds());
        dst_range.setHorizontalAlignments(src_range.getHorizontalAlignments());
        dst_range.setVerticalAlignments(src_range.getVerticalAlignments());
        dst_range.setWraps(src_range.getWraps());

        dst_contents_range = dst_sheet.getDataRange();
        dst_contents_range.setBorder(true, true, true, true, true, true);
    }
    //Completed copy, Now open the dup document and export.
    ui.alert("Backup Complete, Please open " + dup_id + " sheet to view contents.")
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    您可以使用getDataRange() 来获取数据范围(所有行和列至少有一个具有值的单元格),而不是使用A1 表示法来获取范围,然后可以使用getNumRows()getNumColumns()在其他方法中或使用Array.prototype.length() 获取范围尺寸并从目标工作表中获取相同大小的范围。

    资源

    相关

    【讨论】:

      【解决方案2】:

      谢谢@Ruben。那很有帮助。使用 getNumRows() 和 getNumColumns() 做到了。 对于其他人,这里是完整的功能。我还更改了名称并将我的文件 ID 替换为

      function MakeCopyAsValues(dup_id="<google file id>") {
      // Open current Sheet
      var ss = SpreadsheetApp.getActiveSpreadsheet()
      // Supply a duplicate google doc ID.
      var ds = SpreadsheetApp.openById(dup_id)
      // UI element for notifying in the google sheets
      var ui = SpreadsheetApp.getUi() 
      //Copy each sheet one by one
      var sheets = ss.getSheets();
      for (i=0; i<sheets.length; i++) {
          src_sheet = sheets[i];
          sheet_name = src_sheet.getName();
          // Logger.log(sheet_name);  // this was helpful for debugging.
          // If same sheet exists in the destination delete it and create an empty one
          dst_sheet = ds.getSheetByName(sheet_name);
          if (dst_sheet != null) {
              ds.deleteSheet(dst_sheet)
          }
          dst_sheet = ds.insertSheet(sheet_name);
      
          src_range = src_sheet.getDataRange();  //Get the source's range that has data.
          dst_range = dst_sheet.getRange(1,1,src_range.getNumRows(), src_range.getNumColumns());
      
          //Note: DisplayValues is set as Values, formulas are removed in dup sheet
          dst_range.setValues(src_range.getDisplayValues());
          
          //set column widths correctly.  Moving this after the range setting prevents some errors.
          for(j=1; j<=src_sheet.getLastColumn(); j++){
              dst_sheet.setColumnWidth(j, src_sheet.getColumnWidth(j))
          }
          //Other Nice to haves for formatting
          dst_range.setFontColors(src_range.getFontColors());
          dst_range.setFontStyles(src_range.getFontStyles());
          dst_range.setBackgrounds(src_range.getBackgrounds());
          dst_range.setHorizontalAlignments(src_range.getHorizontalAlignments());
          dst_range.setVerticalAlignments(src_range.getVerticalAlignments());
          dst_range.setWraps(src_range.getWraps());
      
          dst_contents_range = dst_sheet.getDataRange();
          dst_contents_range.setBorder(true, true, true, true, true, true);
      }
      ui.alert("Backup Complete, Please open " + dup_id + " sheet to view contents.")
      

      }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-23
        • 1970-01-01
        • 1970-01-01
        • 2014-10-07
        相关资源
        最近更新 更多