一次多次复制模板工作表,同时保持范围保护

时间:2018-10-15 18:10:20

标签: javascript google-apps-script google-sheets

我正在使用代码来复制其中具有多个范围保护的模板工作表,

当前,我正在运行脚本以逐个创建新选项卡。任何人都可以使用以下脚本来帮助我,以便一次完成多次复制模板的操作(例如,从“模板工作表”创建以下选项卡: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 :(得分:3)

此修改如何?我认为您可以使用Sheets API实现所需的功能。该示例脚本的流程如下。

使用此脚本时,请在高级Google服务和API控制台中启用Sheets API。您可以在here上了解如何启用Sheets API。

流量:

  1. 设置复制的工作表名称。例如,这些是["A", "B", "C",,]。这是您的问题。
  2. 使用工作表名称复制模板工作表。
  3. 使用Sheets API从模板表中检索受保护的范围。
  4. 创建请求正文。
  5. 使用表格API将受保护范围设置为复制的表格。

通过此流程,仅通过一个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);
}

参考文献:

如果我误解了您的问题,请告诉我。我想修改它。