Почему ss.deleteSheet () отображает один скрытый лист - PullRequest
2 голосов
/ 09 октября 2019

Я написал небольшой скрипт, который автоматически удаляет все листы, которые мой пользователь случайно создает .

Часто при доступе к электронной таблице с помощью телефона они случайно нажимают «+» исоздать тонны пустых листов, таких как 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

1 Ответ

4 голосов
/ 09 октября 2019

Попробуй это:

function delSheetsKeepHidden() {
  var ss = SpreadsheetApp.getActive();
  var shts = ss.getSheets();
  var hdnShts = [];
  for (var i = 0; i < shts.length; i++) {
    if(shts[i].isSheetHidden()) {
      hdnShts.push(shts[i].getName()); //saving all the hidden sheet names for later
    }   
  }
  for(var i = 0; i < shts.length; i++) {
    if(shts[i].getName().slice(0,5).toLowerCase() == "sheet") {
      ss.deleteSheet(shts[i]); //I think this is just deleting the sheet and not the array element in shts so no reason to keep track of deleted sheets like when deleting rows in a spreadsheet
    }
  }
  for(var i = 0; i<hdnShts.length; i++) {
    ss.getSheetByName(hdnShts[i]).hideSheet(); //just to make sure all the hiddens remain hidden
  }
}

Я заставлял себя уходить от петель старой школы.

function delSheetsKeepHidden() {
  var ss=SpreadsheetApp.getActive();
  var shts=ss.getSheets();
  var hdnShts=[];
  shts.forEach(function(sht){if(sht.isSheetHidden()){hdnShts.push(sht.getName())}});
  shts.forEach(function(sht){if(sht.getName().slice(0,5).toLowerCase()=="sheet"){ss.deleteSheet(sht);}});//I think this is just deleting the sheet and not the array element in shts so no reason to keep track of deleted sheets like when deleting rows in a spreadsheet
  hdnShts.forEach(function(name){ss.getSheetByName(name).hideSheet();});//just to make sure all the hiddens remain hidden
}
...