Это альтернативная реализация @ JSmith's answer , использующая API REST для листов для более эффективного скрытия и отображения большого количества листов.
Для использованияREST API Sheets из Apps Script, сначала вам нужно включить его , поскольку это « расширенный сервис .»
Подход Sheets API позволяет вамработать с представлением данных в JavaScript, вместо того чтобы постоянно взаимодействовать со службой электронных таблиц (например, для проверки имени каждого листа).Кроме того, пакетный вызов API обрабатывается как одна операция, поэтому все изменения видимости отражаются одновременно , а методы showSheet()
и hideSheet()
службы электронных таблиц сбрасываются в браузер после каждого вызова.
var MENUSHEET = "Menu";
function onEdit(e) {
if (!e) return; // No running this from the Script Editor.
const edited = e.range,
sheet = edited.getSheet();
if (sheet.getName() === MENUSHEET && edited.getA1Notation() === "A2")
hideUnselected_(e.source, e.value);
}
function hideUnselected_(wb, choice) {
// Get all the sheets' gridids, titles, and hidden state:
const initial = Sheets.Spreadsheets.get(wb.getId(), {
fields: "sheets(properties(hidden,sheetId,title)),spreadsheetId"
});
// Prefixing the choice with `^` ensures "Red" will match "Reddish Balloons" but not "Sacred Texts"
const pattern = new RegExp("^" + choice, "i");
// Construct the batch request.
const rqs = [];
initial.sheets.forEach(function (s) {
// s is a simple object, not an object of type `Sheet` with class methods
// Create the basic request for this sheet, e.g. what to modify and which sheet we are referencing.
var rq = { fields: "hidden", properties: {sheetId: s.properties.sheetId} };
// The menu sheet and any sheet name that matches the pattern should be visible
if (s.properties.title === MENUSHEET || pattern.test(s.properties.title))
rq.properties.hidden = false;
else
rq.properties.hidden = true;
// Only send the request if it would do something.
if ((!!s.properties.hidden) !== (!!rq.properties.hidden))
rqs.push( { updateSheetProperties: rq } );
});
if (rqs.length) {
// Visibility changes will fail if they would hide the last visible sheet, even if a later request in the batch
// would make one visible. Thus, sort the requests such that unhiding comes first.
rqs.sort(function (a, b) { return a.updateSheetProperties.properties.hidden - b.updateSheetProperties.properties.hidden; });
Sheets.Spreadsheets.batchUpdate({requests: rqs}, initial.spreadsheetId);
}
}
При работе с различными API-интерфейсами REST от Google существует достаточно ресурсов:
Небольшое тестирование в книге с 54 листами, в которой я использовал API Sheets для применения некоторых изменений и @Код JSmith для отмены изменений показал, что подход API примерно в 15 раз быстрее, чем измеряется с помощью console.time
& console.timeEnd
.Изменения API заняли от 0,4 до 1,1 с (в среднем 1 с), в то время как метод обслуживания электронных таблиц занял от 15 до 42 с (в среднем 20 с).