Чтобы удалить 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
)»
ДополнительноЧтение: