如何使用 Apps 脚本从 Google 个工作表中删除一系列特定工作表中所有未受保护的行
How to delete all unprotected rows in a range of particular sheets from Google Sheets using Apps Scripts
我的 Google 工作表的 sheet 中有几个保护范围,例如,A2 到 F40,然后是 A45 到 F90。我使用按钮(菜单--子菜单)来执行此保护范围。但是在一系列特定 sheet 中,只有几行数据不受保护,这些 sheet 的名称同时使用字母和数字(例如 ICT4113、MATH4104 或 HUM4119)。很少有其他 sheet 的名称只包含不需要此功能的字母表。
如何在没有任何触发器的情况下删除函数 onOpen() 内特定 sheet 范围内的那些未受保护的数据行。就在我想删除的时候,我会按一个子菜单。
我相信你的目标如下。
- 您想使用 Google Apps 脚本完全删除没有特定 sheet 保护范围的行。
- 您有几个特定的 sheet 想要实现此目标。
- 您想通过 Google 上的自定义菜单 运行 传播脚本sheet。
为此,这个答案怎么样?此示例脚本的流程如下。
- 检索数据范围。
- 从受保护的范围创建一个对象。这用于从已清除的行中删除。
- 创建范围列表以使用对象清除行。
- 删除没有保护范围行的行。
示例脚本:
请将以下脚本复制并粘贴到脚本编辑器中并设置sheet名称,然后重新打开Spreadsheet。由此,定制菜单被设置。当你运行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()));
});
}
参考文献:
我的 Google 工作表的 sheet 中有几个保护范围,例如,A2 到 F40,然后是 A45 到 F90。我使用按钮(菜单--子菜单)来执行此保护范围。但是在一系列特定 sheet 中,只有几行数据不受保护,这些 sheet 的名称同时使用字母和数字(例如 ICT4113、MATH4104 或 HUM4119)。很少有其他 sheet 的名称只包含不需要此功能的字母表。
如何在没有任何触发器的情况下删除函数 onOpen() 内特定 sheet 范围内的那些未受保护的数据行。就在我想删除的时候,我会按一个子菜单。
我相信你的目标如下。
- 您想使用 Google Apps 脚本完全删除没有特定 sheet 保护范围的行。
- 您有几个特定的 sheet 想要实现此目标。
- 您想通过 Google 上的自定义菜单 运行 传播脚本sheet。
为此,这个答案怎么样?此示例脚本的流程如下。
- 检索数据范围。
- 从受保护的范围创建一个对象。这用于从已清除的行中删除。
- 创建范围列表以使用对象清除行。
- 删除没有保护范围行的行。
示例脚本:
请将以下脚本复制并粘贴到脚本编辑器中并设置sheet名称,然后重新打开Spreadsheet。由此,定制菜单被设置。当你运行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()));
});
}