有没有优化组功能Google Docs(App Script)的可能性?
Are there any possibilities for optimization group function Google Docs(App Script)?
我在使用应用程序脚本自动化文档方面还很陌生。我有一个每天早上更新的动态电子表格(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));
}
试试这个:
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));
}
我相信你的目标如下。
- 您想减少
removeAllGroups
和 groupRows
函数的处理成本。
我看到你的脚本的时候还以为在你的脚本里面,sheet.getRowGroup(row, depth).remove()
和rootSheet.getRange(i + 2, 1).shiftRowGroupDepth(a)
的处理成本可能很高。在这种情况下,我想建议使用 Sheets API。我认为当使用 Sheets API 时,处理成本可能会降低一些。当 Sheets API 反映在你的脚本中时,它变成如下。
示例脚本:
在你运行这个脚本之前,please enable Sheets API at Advanced Google services。
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());
}
注:
- 当上面修改的脚本没有用时,能否提供示例电子表格?据此,我想修改脚本。
参考文献:
我在使用应用程序脚本自动化文档方面还很陌生。我有一个每天早上更新的动态电子表格(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));
}
试试这个:
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));
}
我相信你的目标如下。
- 您想减少
removeAllGroups
和groupRows
函数的处理成本。
我看到你的脚本的时候还以为在你的脚本里面,sheet.getRowGroup(row, depth).remove()
和rootSheet.getRange(i + 2, 1).shiftRowGroupDepth(a)
的处理成本可能很高。在这种情况下,我想建议使用 Sheets API。我认为当使用 Sheets API 时,处理成本可能会降低一些。当 Sheets API 反映在你的脚本中时,它变成如下。
示例脚本:
在你运行这个脚本之前,please enable Sheets API at Advanced Google services。
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());
}
注:
- 当上面修改的脚本没有用时,能否提供示例电子表格?据此,我想修改脚本。