Я написал небольшой скрипт, который автоматически удаляет все листы, которые мой пользователь случайно создает .
Часто при доступе к электронной таблице с помощью телефона они случайно нажимают «+» исоздать тонны пустых листов, таких как Sheet101, Sheet102 и т. д.
Мой сценарий очень прост: получает все листы, а , если имя начинается с Sheet, просто удаляет его .
Работает отлично, но после удаления всех нежелательных листов проблема в том, что он автоматически отображает первый скрытый лист (некоторые листы скрыты для практического использования, так как они содержатсписки).
Например, если у меня есть следующие скрытые листы: oldform
, list1
, list2
, ... После выполнения сценария лист oldform
будетскрытый, таким образом появляясь перед пользователями.
Вот два кода, которые я пробовал:
Простой:
function DELETESHEETS2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
if ( sheets[i].getName().indexOf("Sheet") > -1 ) {
ss.deleteSheet(sheets[i]);
}
}
}
Тот, который я пытался изменить, чтобы решить мою проблему:
function DELETESHEETS3() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = 0; i < sheets.length; i++) {
if ( sheets[i].getName().indexOf("Sheet") > -1 ) {
label = sheets[i].getName();
toto = ss.getSheetByName(label);
ss.deleteSheet(toto);
}
}
}
Обратный цикл
При этом скрытый лист появляется в начале, а не в конце:
function DELETESHEETS2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
for (i = sheets.length -1; i > 0 ; i--) {
if ( sheets[i].getName().indexOf("Sheet") > -1 ) {
ss.deleteSheet(sheets[i]);
}
}
}
Частичноерешение
Это работает благодаря @OMila. Но это не объясняет странное поведение простого цикла. Может быть, я что-то пропустил?
function DELETESHEETS2() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheets = ss.getSheets();
var hdnShts = [];
for (var i = 0; i < sheets.length; i++) {
if(sheets[i].isSheetHidden()) {
hdnShts.push(sheets[i].getName()); //saving all the hidden sheet names for later
}
}
for (i = 0; i < sheets.length; i++) {
if ( sheets[i].getName().indexOf("Sheet") > -1 ) {
ss.deleteSheet(sheets[i]);
}
}
for(var i = 0; i<hdnShts.length; i++) {
ss.getSheetByName(hdnShts[i]).hideSheet(); //just to make sure all the hiddens remain hidden
}
}
Спасибо за вашу помощь, если у вас есть идеи!
PS: эту проблему легко воспроизвести, просто создайте много листов, в том числе один с именем другоечем Sheetxxx