Google脚本在多个工作表上批量处理行,以加快处理速度

时间:2017-12-12 16:24:10

标签: arrays google-apps-script google-sheets row hide

我一直试图找出Google表格中的一些批量技术,这些技术在Excel中很容易实现。

在包含22个选项卡的工作簿上,前12个选项卡以一年中的几个月命名。我尝试自动隐藏仅在前12个标签中以A列开头的某些行

我的当前脚本非常慢,因为它是逐行计算的。

我想在名为JAN,FEB等的前12个标签上选择行5到94 上的数据,不包括计算前的剩余标签跑。我似乎无法掌握阵列功能,如果这是最好的技术。

您可以提供批量处理这些行的任何帮助,我们将不胜感激。

function hideRows() {
["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"].forEach(function (s) {
    var sheet = SpreadsheetApp.getActive()
        .getSheetByName(s)
    sheet.unhideRow(sheet.getRange('A1:X94'))  
    sheet.getRange('A1:X94')
    sheet.getRange('A1:X94')
        .getValues()
        .forEach(function (r, i) {
            if (!r[0]) sheet.hideRows(i + 1)
        });
    });
}

2 个答案:

答案 0 :(得分:0)

按列A排序,批量隐藏行,然后取消排序。

function hideRows() {

  var sheet, range, values, row, col95, // col95 will be a helper column that will unsort back to the original order. 
      arr95 = []; // this array will hold the values for col95

  for (i = 0; i < 95; i++) {
    arr95.push([i + 1]);
  }

  ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"].forEach(function (s) {
    sheet =  SpreadsheetApp.getActive()
    .getSheetByName(s);

    sheet.insertColumnAfter(1); // this column, used for sorting, will be deleted at the end.
    col95 = sheet.getRange("B1:B95");
    col95.setValues(arr95);

    range = sheet.getRange('1:94'); // don't specify A1:X94 in case you have data in Column Y
    range.sort(1);
    range = sheet.getRange('1:94');
    sheet.unhideRow(range);
    values = range.getValues();

    row = 94; // resetting row to a neutral number 
    for (r = 0, i = 0; r < values.length; r++) {
      if (!values[r][0]) {
        row = r + 1;
        break; // as soon as we get an empty A-cell, the row is set and the loop ends.
      }
    }

    if (row < 94) sheet.hideRow(sheet.getRange(row + ':94')); // batch-hiding all rows with an empty col A
    range = sheet.getRange('1:94');
    range.sort(2);
    sheet.deleteColumn(2); // the unsorting column is deleted.
  });
}

这是批次隐藏行:

    if (row < 94) sheet.hideRow(sheet.getRange(row + ':94')); // batch-hiding all rows with an empty col A

与原始代码相比,此代码在我的测试中将运行时间减少了10倍。权衡的是它并不简洁。

答案 1 :(得分:0)

forEach似乎在这里过度使用。此外,该脚本采用了一种非常不寻常的结构。

假设它总是第一次 12张,你要么不关心数据出现的顺序,要么有一个你可以排序的列

function hideRows() {
  var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets()
  var count

  for (count = 0; count < 12; count++) {
    // sort the sheet by column A ascending to get all empty cells at the bottom
    sheets[count].sort(1,true)

    // find out the last row with data on column A
    var lastRow = sheets[count].getRange('A5:A94').getLastRow() 

    // hide all rows bellow the last data row. You need to add 1 for the first empty row and 5 more because we skipped a few when getting the range
    sheets[count].hideRows(lastRow + 6, 94 - lastRow)

   // If you don't care how it's sorted leave it, or sort by the correct column here
  }
}

这应该尽可能少地批量调用SpreadsheetApp。我没有测试这段代码,只是直接写在这里,所以你可能想检查一些东西(比如下面会在底部或顶部放置空行)以及hideRows索引的计算。

编辑:刚检查getLastRow()将返回所选范围的最后一个索引,而不是最后一行包含实际数据,因此,如果您的范围为A5:A94,那么将返回94,因此它的工作方式略有不同,如果它是一张工作表。但是你可以简单地运行一个for来检查值对数组的空字符串,因为你只需要在值停止时找到它就更快了。