如何使用Apps脚本删除特定的Google表格中所有不受保护的行

问题描述 投票:0回答:1

我的Google表格中有几个保护范围,例如A2到F40,然后是A45到F90。我使用按钮(菜单-子菜单)执行此受保护范围。但是在整个特定工作表中只有很少的几行数据不受保护。

我如何在函数onOpen()内的整个工作表中删除那些不受保护的数据行,而无需任何触发器。刚要删除时,我将按一个子菜单。

google-apps-script google-sheets google-sheets-macros
1个回答
0
投票

我相信您的目标如下。

  • 您想使用Google Apps脚本完全删除特定工作表没有保护范围的行。
    • 有几个具体的表格要实现。
  • 您想通过Google Spreadsheet上的自定义菜单运行脚本。

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

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

示例脚本:

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

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Custom Menu').addItem('run script', 'myFunction').addToUi();
}

function myFunction() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const sheetNames = ["###", "###",,,];  // Please set the sheet names.
  sheetNames.forEach(s => {
    // 1. Retrieve data range.
    const sheet = ss.getSheetByName(s);
    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 = 1; r <= dataRange.getNumRows(); r++) {
      for (let e = 0; e < protectedRanges.length; e++) {
        if (protectedRanges[e].start == r) {
          r = protectedRanges[e].end + 1;
          break;
        }
      }
      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()));
  });
}

参考:

© www.soinside.com 2019 - 2024. All rights reserved.