我是使用app脚本自动化文档的新手。我有一个动态的电子表格(4000+行),每天早上更新,并且必须在特殊条件下重新分组数据。所以我有一个脚本和设置时间触发器。但是运行这个脚本需要花费很多时间(~30分钟),而且我担心如果数据量增长-它将会有很多失败(因为超时)。我把我的脚本留在下面。你能给我一些建议,我如何优化这个脚本,让它工作得更快?提前感谢!
function removeAllGroups() {
let sheet = SpreadsheetApp.getActive().getSheetByName("sheet1");
let lastRow = sheet.getDataRange().getLastRow();
for (let row = 1; row < lastRow; row++) {
let depth = sheet.getRowGroupDepth(row);
if (depth < 1) continue;
sheet.getRowGroup(row, depth).remove();
}
}
function groupRows() {
const sheetName = "sheet1";
const rootSheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
const levels = rootSheet.getRange("A2:A" + rootSheet.getLastRow()).getValues();
levels.forEach(([a], i) => rootSheet.getRange(i + 2, 1).shiftRowGroupDepth(a));
}
我相信你的目标是这样的。
- 您希望降低
removeAllGroups
和groupRows
功能的工艺成本。
当我看到你的脚本时,我认为在你的脚本中,sheet.getRowGroup(row, depth).remove()
和rootSheet.getRange(i + 2, 1).shiftRowGroupDepth(a)
的工艺成本可能很高。在这种情况下,我想建议使用表API。我认为当使用Sheets API时,过程成本可能会降低一点。当Sheets API在脚本中反映时,它变成如下所示:
示例脚本:
在运行此脚本之前,请在Advanced Google services中启用Sheets API。
function removeAllGroups() {
const sheetName = "sheet1";
const ss = SpreadsheetApp.getActive();
const ssId = ss.getId();
const sheetId = ss.getSheetByName(sheetName).getSheetId();
const n = Sheets.Spreadsheets.get(ssId, { ranges: [sheetName] }).sheets[0].rowGroups.reduce((n, { depth }) => n < depth ? depth : n, 0);
const requests = Array(n).fill("").map(_ => ({ deleteDimensionGroup: { range: { sheetId, dimension: "ROWS" } } }));
Sheets.Spreadsheets.batchUpdate({ requests }, ssId);
}
function groupRows() {
const sheetName = "sheet1";
const ss = SpreadsheetApp.getActive();
const rootSheet = ss.getSheetByName(sheetName);
const levels = rootSheet.getRange("A2:A" + rootSheet.getLastRow()).getValues();
const sheetId = rootSheet.getSheetId();
const requests = levels.flatMap(([a], i) => Array(a).fill("").map(_ => ({ addDimensionGroup: { range: { sheetId, startIndex: i + 1, endIndex: i + 2, dimension: "ROWS" } } })));
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
注意:
- 当上面修改的脚本没有用时,能否提供样例电子表格?通过这个,我想修改脚本。
引用:
- 方法:spreadsheets.get
- 方法:spreadsheets.batchUpdate
- DeleteDimensionGroupRequest
- AddDimensionGroupRequest
试试这个:
function removeAllGroups() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName("sheet1");
const rg = sh.getDataRange();
const vs = rg.getValues();
vs.forEach((r, i) => {
let d = sh.getRowGroupDepth(i + 1);
if (d >= 1) {
sh.getRowGroup(i + 1, d).remove()
}
});
}
function groupRows() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Sheet1');
const levels = sh.getRange(2, 1, sh.getLastRow() - 1).getValues().flat();
levels.forEach((e, i) => sh.getRange(i + 2, 1).shiftRowGroupDepth(e));
}