代码之家  ›  专栏  ›  技术社区  ›  strumpy_strudel

使用Apps Script删除可见行的非迭代解决方案?

  •  0
  • strumpy_strudel  · 技术社区  · 4 年前

    我有一个文件需要复制大约125次:每个用户一个副本。表中大约有1000行。我选择只复制这个文件,这样受保护的范围、格式、过滤器等就可以遵循它,而不必重新创建它们。

    到目前为止,我拥有的应用程序脚本:

    1. 获取指定列中的唯一电子邮件数组(约125封唯一电子邮件)。
    2. 遍历该数组,同时生成“主”文件(具有1000行的文件)的副本。
    3. 将筛选器添加到重复文件中的列中,并排除当前唯一的电子邮件地址。
    4. 然后遍历每一行并检查 !documentObject.isRowHiddenByFilter(row) 并删除该行,如果 true .
    5. 最后,删除过滤器,该过滤器仅向目标用户显示与其相关的记录。

    为了删除可见行,我正在执行以下操作:

      deleteVisibleRows(documentObject, lastRow) {
        for (let r = lastRow; r > 1; r--) {
          if(!documentObject.isRowHiddenByFilter(r)) {
            documentObject.deleteRow(r);
          }
        }
      } 
    

    这真的很慢: 125 iterations * 1000 rows = 125,000 rows .

    我更希望能够 selectRange deleteVisibleRows 而不需要迭代来加快速度。

    据我所知,没有一种方法可以直接删除可见行。它很可能是可见的,不可见的行也不会是连续的。

    有什么建议吗?

    0 回复  |  直到 4 年前
        1
  •  1
  •   Tanaike    4 年前

    我相信你的目标如下。

    • 您希望降低脚本的处理成本。

    在这种情况下,我认为当使用Sheets API时,可以降低工艺成本。因此,在这个答案中,我想建议使用Sheets API。

    从你的剧本中,我了解到你的价值观 documentObject lastRow 分别是类表的对象和整数。在这个答案中,这些值用于图纸API的请求。当你的脚本 deleteVisibleRows 修改后,它变为如下。

    修改的脚本:

    在使用此脚本之前, please enable Sheets API at Advanced Google services .

    function deleteVisibleRows(documentObject, lastRow) {
      const spreadsheetId = documentObject.getParent().getId();
      const sheetName = documentObject.getSheetName();
      const sheetId = documentObject.getSheetId();
      const rowMetadata = Sheets.Spreadsheets.get(spreadsheetId, { ranges: [sheetName], fields: "sheets(data(rowMetadata(hiddenByFilter)))" }).sheets[0].data[0].rowMetadata;
      const requests = rowMetadata.reduceRight((ar, { hiddenByFilter }, i) => {
        if (!hiddenByFilter && i > 0 && i + 1 < lastRow) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
        return ar;
      }, []);
      Sheets.Spreadsheets.batchUpdate({requests}, spreadsheetId);
    }
    

    笔记

    • 当运行此函数时,显示的行将被删除。请小心。因此,当您测试这个脚本时,我建议您使用一个示例电子表格。

    参考文献: