Как насчет этой модификации?Я думаю, что вы можете достичь того, чего хотите, используя Sheets API.Этот пример сценария выглядит следующим образом.
Когда вы используете этот сценарий, включите Sheets API в Advanced Google Services и консоли API.О том, как включить API листов, можно узнать по адресу здесь .
Flow:
- Установить имена копируемых листов.Например, это
["A", "B", "C",,]
.Это из вашего вопроса. - Копирование листа шаблона с использованием имен листов.
- Получение защищенных диапазонов из листа шаблона с использованием API листов.
- Создание тела запроса.
- Установка защищенных диапазонов для копируемых листов с помощью API Sheets.
С помощью этого потока защищенные диапазоны листа Template могут быть скопированы на все скопированные листы только одним вызовом API.
Измененный скрипт:
function duplicateSheetWithProtections() {
var sheetNames = ["A", "B"]; // Please set copied sheet names here.
var ss = SpreadsheetApp.getActiveSpreadsheet();
var spreadsheetId = ss.getId();
var sheet = ss.getSheetByName('Template');
// Copy template sheet.
var copiedSheetIds = sheetNames.map(function(e) {return sheet.copyTo(ss).setName(e).getSheetId()});
// Retrieve protected ranges from Template sheet.
var sheets = Sheets.Spreadsheets.get(spreadsheetId).sheets;
var templateSheet = sheets.filter(function(e) {return e.properties.title == "Template"});
var protectedRanges = templateSheet[0].protectedRanges;
// Create request body.
var resources = copiedSheetIds.map(function(e) {
return protectedRanges.map(function(f) {
var obj = JSON.parse(JSON.stringify(f));
delete obj.protectedRangeId;
if (obj.warningOnly) delete obj.editors;
obj.range.sheetId = e;
return {"addProtectedRange": {"protectedRange": obj}};
});
});
resources = Array.prototype.concat.apply([], resources);
// Set protected ranges to copied sheets
Sheets.Spreadsheets.batchUpdate({"requests": resources}, spreadsheetId);
}
Ссылки:
Если я неправильно понял ваш вопрос, пожалуйста, скажите мне.Я хотел бы изменить его.