google-apps-script - 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();
}
}};
解决方案
在这种情况下,我想建议使用 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());
}
推荐阅读
- php - 如何从 Laravel 关系中的记录中获取第一个条目?
- php - Laravel API:上传后出现 NotFoundHttpException
- java - 使用 Java JNA 调用 DLL 库
- ninject - 使用 Ninject 解析类型绑定 ToConstant
- java - JAVA 9 及更高版本中的逃逸分析和堆栈分配优化改进
- powershell - 如何将变量合并到一个字符串并输出到 CSV 中的特定列?
- c++ - C ++ Stack Push方法不将结构推入堆栈,只返回0
- android - 轻按 Arcore 平面时获取 GPS 坐标
- build - 将未知的出局列表链接到 cc_library
- google-chrome - PWA manifest.json start_url 失败