首页 > 解决方案 > Google Script MergedRanges 性能问题

问题描述

我正在尝试拆分空的合并单元格。以下代码可以工作,但速度很慢,例如在处理 200 多个合并范围时经常超时,关于如何提高性能的任何建议?

function EmptyMerged() {

var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName("1");

var range = sheet.getRange("B3:NA27");


var mergedRanges = range.getMergedRanges();
for (var i = 0; i < mergedRanges.length ; i++) {


  if(mergedRanges[i].isBlank() === true){
            mergedRanges[i].breakApart();
  }
}};

标签: google-apps-scriptgoogle-sheets

解决方案


在这种情况下,我想建议使用 RangeList 来降低脚本的处理成本。当你的脚本被修改后,它变成如下。

修改后的脚本:

function EmptyMerged() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("1");
  var range = sheet.getRange("B3:NA27");
  var mergedRanges = range.getMergedRanges();
  
  // I modified below script.
  var ranges = mergedRanges.reduce((ar, r) => {
    if (r.isBlank()) ar.push(r.getA1Notation());
    return ar;
  }, []);
  sheet.getRangeList(ranges).breakApart();
}

笔记:

  • 我认为在您的情况下,也可以使用 Sheets API。但我想,当使用范围列表时,脚本会更简单。所以我提出了上面修改的脚本。如果上述修改后的脚本不是您问题的直接解决方案,请告诉我。那时,我想建议使用 Sheets API。

参考:

添加1:

从您的以下回复中,

谢谢您的帮助!这确实似乎有点快,但不幸的是脚本仍然需要很长时间才能执行(超时)。我是 Sheets API 的新手,因此非常感谢任何进一步的解释。

我添加了示例脚本以使用 Sheets API 实现您的目标。

示例脚本:

在使用此脚本之前,请在 Advanced Google services 中启用 Sheets API

function EmptyMerged2() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("1");
  var range = sheet.getRange("B3:NA27");
  var startRowIndex = range.getRow() - 1;
  var startColumnIndex = range.getColumn() - 1;
  var endRowIndex = startRowIndex + range.getNumRows();
  var endColumnIndex = startColumnIndex + range.getNumColumns();
  var requests = [{unmergeCells: {range: {sheetId: sheet.getSheetId(), startRowIndex: startRowIndex, startColumnIndex: startColumnIndex, endRowIndex: endRowIndex, endColumnIndex: endColumnIndex}}}];
  Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}

如果要取消合并工作表中的所有合并单元格,还可以使用以下脚本。它变得有点简单。

function EmptyMerged3() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("1");
  var requests = [{unmergeCells: {range: {sheetId: sheet.getSheetId()}}}];
  Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}

参考:

添加2:

以下示例脚本取消合并空的合并单元格。

示例脚本:

function EmptyMerged4() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("1");
  var range = sheet.getRange("B3:NA27");
  var mergedRanges = range.getMergedRanges();
  var sheetId = sheet.getSheetId();
  var requests = mergedRanges.reduce((ar, e) => {
    if (e.isBlank()) {
      var startRowIndex = e.getRow() - 1;
      var startColumnIndex = e.getColumn() - 1;
      var endRowIndex = startRowIndex + e.getNumRows();
      var endColumnIndex = startColumnIndex + e.getNumColumns();
      ar.push({unmergeCells: {range: {sheetId: sheetId, startRowIndex: startRowIndex, startColumnIndex: startColumnIndex, endRowIndex: endRowIndex, endColumnIndex: endColumnIndex}}});
    }
    return ar;
  }, []);
  Sheets.Spreadsheets.batchUpdate({requests: requests}, ss.getId());
}

推荐阅读