Дублирование листа шаблона много раз за раз с сохранением защиты диапазона - PullRequest
0 голосов
/ 15 октября 2018

Я использую код для дублирования листа шаблона с несколькими диапазонами защиты внутри него,

В настоящее время я запускаю скрипт для создания по одной новой вкладки.Может ли кто-нибудь помочь мне с помощью следующего сценария, чтобы иметь возможность дублировать шаблон много раз за один раз (Пример создания из шаблона листа следующие вкладки: A, B, C, D, E, F) за один раз:

Сценарий

function duplicateSheetWithProtections() {
var ss = SpreadsheetApp.getActiveSpreadsheet(); 
sheet = ss.getSheetByName('Template');
sheet2 = sheet.copyTo(ss).setName('A'); 
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var p = protections[i];
var rangeNotation = p.getRange().getA1Notation();
var p2 = sheet2.getRange(rangeNotation).protect();
p2.setDescription(p.getDescription());
p2.setWarningOnly(p.isWarningOnly());
if (!p.isWarningOnly()) {
  p2.removeEditors(p2.getEditors());
  p2.addEditors(p.getEditors());
}
}
}

Спасибо за помощь

1 Ответ

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

Как насчет этой модификации?Я думаю, что вы можете достичь того, чего хотите, используя Sheets API.Этот пример сценария выглядит следующим образом.

Когда вы используете этот сценарий, включите Sheets API в Advanced Google Services и консоли API.О том, как включить API листов, можно узнать по адресу здесь .

Flow:

  1. Установить имена копируемых листов.Например, это ["A", "B", "C",,].Это из вашего вопроса.
  2. Копирование листа шаблона с использованием имен листов.
  3. Получение защищенных диапазонов из листа шаблона с использованием API листов.
  4. Создание тела запроса.
  5. Установка защищенных диапазонов для копируемых листов с помощью 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);
}

Ссылки:

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

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