【问题标题】:How to delete all unprotected rows in a range of particular sheets from Google Sheets using Apps Scripts如何使用 Apps 脚本从 Google 表格中删除一系列特定表格中所有未受保护的行
【发布时间】:2020-06-07 04:15:00
【问题描述】:

我的 Google 表格中有多个受保护范围,例如 A2 到 F40,然后是 A45 到 F90。我使用一个按钮(菜单--子菜单)来完成这个受保护的范围。但是,在一系列特定工作表中,很少有数据行不受保护,这些工作表的名称使用字母和数字一起使用(例如 ICT4113、MATH4104 或 HUM4119)。很少有其他表的名称仅包含不需要此功能的字母。

如何在没有任何触发器的情况下删除函数 onOpen() 内一系列特定工作表中的那些不受保护的数据行。就在我想删除的时候,我会按一个子菜单。

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-macros


    【解决方案1】:

    我相信你的目标如下。

    • 您想使用 Google Apps 脚本完全删除对特定工作表没有保护范围的行。
      • 您希望通过几个特定的​​工作表来实现这一目标。
    • 您希望通过 Google 电子表格上的自定义菜单运行脚本。

    对于这个,这个答案怎么样?该示例脚本的流程如下。

    1. 检索数据范围。
    2. 从受保护范围内创建一个对象。这用于从清除的行中删除。
    3. 使用对象创建用于清除行的范围列表。
    4. 删除没有受保护范围行的行。

    示例脚本:

    请将以下脚本复制并粘贴到脚本编辑器并设置工作表名称,然后重新打开电子表格。由此,设置了自定义菜单。当您运行myFunction 时,没有保护范围的行的单元格将被删除。

    function onOpen() {
      SpreadsheetApp.getUi().createMenu('Custom Menu').addItem('run script', 'myFunction').addToUi();
    }
    
    function myFunction() {
      const ss = SpreadsheetApp.getActiveSpreadsheet();
      ss.getSheets().filter(s => /\d/.test(s.getSheetName())).forEach(sheet => {
        // 1. Retrieve data range.
        const dataRange = sheet.getDataRange();
    
        // 2. Create an object from the protected range. This is used for removing from the cleared rows.
        const protectedRanges = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE).map(e => {
          const r = e.getRange();
          const start = r.getRow();
          return {start: start, end: r.getNumRows() + start - 1};
        });
    
        // 3. Create range list for clearing rows using the object.
        let rangeList = [];
        for (let r = 2; r <= dataRange.getNumRows(); r++) {
          let bk = false;
          for (let e = 0; e < protectedRanges.length; e++) {
            if (protectedRanges[e].start == r) {
              r = protectedRanges[e].end;
              bk = true;
              break;
            }
          }
          if (!bk) rangeList.push(`A${r}:${r}`);
        }
    
        // 4. Delete the rows without the rows of the protected ranges.
        sheet.getRangeList(rangeList).getRanges().reverse().forEach(r => sheet.deleteRow(r.getRow()));
      });
    }
    

    参考资料:

    【讨论】:

    • 请注意,我需要删除所有未受保护的数据行。不只清零。我需要删除电子表格中一系列特定工作表的数据行。例如,那些具有字母数字名称的工作表,如 ICTE4113、MATH4115、HUM4118 等。我那里很少有其他选项卡,例如不需要此功能的 Master(只有字母名称)。
    • @Aktaruzzaman Liton 感谢您的回复。对于给您带来的不便和我糟糕的英语水平,我深表歉意。您想要完全删除没有几个特定工作表的受保护范围的行。我从你的回复中明白了这一点。为此,我更新了我的答案。你能确认一下吗?如果这不是您期望的方向,我再次道歉。
    • 你是对的。请您自动获取工作表名称。在我的电子表格中,有 8 个主题/表格/选项卡,其代码类似于 ICTE4113、MATH4110、HUM4103 等(没有空格,只有字母和数字),还有其他选项卡,例如 Master、TempDataSet(只有字母,没有数字) )。首先,我们需要将所有同时包含字母和数字的工作表名称收集在一起,并通过按下像 REFRESH 之类的子菜单来执行将不受保护的数据范围删除到所有工作表的功能。就是这样。
    • @Aktaruzzaman Liton 感谢您的回复。对于给您带来的不便,我深表歉意。我更新了我的答案以供您回复。你能确认一下吗?
    • 它无法正常工作。我将其更改为单张纸。该表具有 A2:F84 保护范围,然后再次 A85:F90 保护。然后我增加了一些出席率。当我执行您的代码时,它正在删除 A85:F90 所有数据行和标题行。所以最后,它仍然作为 A1:F83 保护。请注意,代码在 A1 到 F1 上没有做任何事情(第一行,因为它是标题行)。并且工作表中有许多受保护的范围,例如 A2:F84、A85:F90、A95:F100。您的代码不应对所有受保护的范围和标题行执行任何操作,应删除所有其他行。
    猜你喜欢
    • 2016-10-21
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2013-04-11
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多