我在“Masters”選項卡的 A2:A 中有一張包含選項卡名稱串列的作業表。我想洗掉不在上面串列中的現有選項卡。我發現這個腳本很有幫助:
function DELETESHEETS() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i ) {
switch(sheets[i].getSheetName()) {
case "Master":
break;
default:
ss.deleteSheet(sheets[i]);}}}
如何將選項卡名稱的范圍添加到此豁免中?
uj5u.com熱心網友回復:
我相信你的目標如下。
- “Master”表的“A”列中有表名。您希望以串列形式檢索這些作業表名稱。
- 您要洗掉作業表名稱未包含在串列中的作業表。
在您的腳本中,未使用“主”表的“A”列的表名稱串列。當此串列反映到您的腳本中時,以下修改后的腳本如何?
修改后的腳本:
function DELETESHEETS() {
var sheetName = "Master";
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheetByName(sheetName);
var list = [[sheetName], ...sheet.getRange("A2:A" sheet.getLastRow()).getValues()].reduce((o, [a]) => (o[a] = true, o), {});
ss.getSheets().forEach(s => {
if (!list[s.getSheetName()]) ss.deleteSheet(s);
});
}
筆記:
- 運行此腳本時,活動電子表格中的作業表將被洗掉。請注意這一點。因此,為了測驗此腳本,我建議使用包含示例表的示例電子表格。
參考:
- 減少()
- forEach()
uj5u.com熱心網友回復:
Switch不適合這種情況。將過濾器 與Set一起使用:
function DELETESHEETS_so70376198() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const exclude = new Set(
ss
.getSheetByName('Master')
.getRange('A2:A')
.getValues()
.flat()
);
ss.getSheets()
.filter((sh) => !exclude.has(sh.getName()))
.forEach((sh) => ss.deleteSheet(sh));
}
確保還將Master名稱包含在中Master!A2:A,否則它也會被洗掉。
uj5u.com熱心網友回復:
function delShts() {
const ss = SpreadsheetApp.getActive();
const sh = ss.getSheetByName('Master');
const kshts = sh.getRange(2,1,sh.getLastRow() - 1).getValues().flat();
ss.getSheets().filter(sh => !~kshts.indexOf(sh.getName())).forEach(sh => ss.deleteSheet(sh));
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/384482.html
