有没有优化组功能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));
}

我相信你的目标如下。

  • 您想减少 removeAllGroupsgroupRows 函数的处理成本。

我看到你的脚本的时候还以为在你的脚本里面,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());
}

注:

  • 当上面修改的脚本没有用时,能否提供示例电子表格?据此,我想修改脚本。

参考文献: