如何使用应用脚本从 Google 表格中删除一系列特定工作表中所有未受保护的行



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

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

我相信你的目标如下。

  • 您希望使用Google Apps Script完全删除对特定工作表没有受保护范围的行。
    • 您希望实现此目的的几个特定工作表。
  • 您希望通过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()));
});
}

引用:

  • G Suite 中的自定义菜单
  • 获取保护(类型(
  • getRangeList(a1Notations(

最新更新