Удаление листов, не найденных при поиске - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь удалить ненужные листы из шаблона после копирования соответствующей информации.Для этого я ищу название листа с контрольным списком.Если поиск возвращает значение 0.0, я хочу удалить лист.

function myFunction() {

var studentsheet = SpreadsheetApp.openById('1Qj9T002nF6SbJRq-iINL2NisU7Ld0kSrQUkPEa6l31Q').;

var sheetsCount = studentsheet.getNumSheets();
var sheets = studentsheet.getSheets();
for (var i = 0; i < sheetsCount; i++){
      var sheet = sheets[i]; 
      var sheetName = sheet.getName();

  Logger.log(sheetName);
var index = match(sheetName);

 Logger.log(index);
  if (index = "0.0"){
var ss = studentsheet.getSheetByName(sheetName).activate();
    ss.deleteactivesheet();
}
  else {}
}

function match(subject) {

 var sourcesheet = SpreadsheetApp.openById('14o3ZG9gQt9RL0iti5xJllifzNiLuNxWDwTRyo-x9STI').getSheetByName("Sheet6").activate();

  var lookupvalue = subject;
  var lookuprange = sourcesheet.getRange(2, 2, 14, 1).getValues().map(function(d){ return d[0] });

 var index = lookuprange.indexOf(subject)+1;
  return index;
}
};

Проблема в конце при попытке удалить лист.Я изменил код, чтобы он выбирал лист и делал его активным, но в следующей строке мне не разрешено звонить .deleteactivesheet().Кто-нибудь знает, как я могу написать эту конечную часть, где я могу выбрать лист на основе индекса индекса, равного 0, а затем удалить его?

1 Ответ

0 голосов
/ 03 октября 2018

Чтобы удалить Sheet из Spreadsheet, есть два применимых метода класса Spreadsheet (как всегда, орфография и использование заглавных букв в JavaScript):

Первый подходит для любоготип сценария и любой тип триггера, в то время как последний имеет смысл только из связанного сценария, работающего от вызова на основе пользовательского интерфейса (либо триггер редактирования / изменения, щелчок меню или другое ручное выполнение), потому что «активация» листаявляется бессмысленной операцией для ресурса Spreadsheet, который не открыт в пользовательском интерфейсе с подключенным экземпляром скрипта приложения.

Таким образом, минимально необходимая модификация:

var index = match(sheet);
if (index === 0) { // if Array#indexOf returned -1 (not found), `match` returned -1 + 1 --> 0
  studentsheet.deleteSheet(sheet);
}

Более подходящая модификациябудет выглядеть примерно так:

function deleteNotFoundSheets() {
  const studentWb = SpreadsheetApp.openById("some id");
  const lookupSource = getLookupRange_(); // assumes the range to search doesn't depend on the sheets that may be deleted.

  studentWb.getSheets().filter(function (s) {
    return canDelete_(lookupSource, s.getName());
  }).forEach(function (sheetToDelete) {
    studentWb.deleteSheet(sheetToDelete);
  });
}

function getLookupRange_() {
  const source = SpreadsheetApp.openById("some other id");
  const sheet = source.getSheetByName("some existing sheet name");
  const r = sheet.getRange(...);
  return r.getValues().map(...);
}
function canDelete_(lookupRange, subject) {
  /** your code that returns true if the subject (the sheet name) should be deleted */
}

Эта модификация использует доступные методы класса Array, чтобы упростить логику вашего кода (удаляя итераторы, единственной целью которых является итерация, и вместо этого выставлятьсодержал значения для анонимных функций обратного вызова).По сути, этот код очень легко понять как «из всех листов, мы хотим эти (filter), и мы хотим сделать то же самое с ними (forEach

ДополнительноЧтение:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...