web-dev-qa-db-fra.com

Comment dupliquer un modèle de feuille Google Sheet de manière dynamique, en préservant les autorisations des cellules protégées

J'ai deux fonctions de script Google Sheet qui fonctionnent indépendamment l'une de l'autre: 1) duplique une feuille modèle, en remplissant chaque feuille dupliquée à partir d'une rangée distincte de données dans une plage source; 2) crée une copie unique de la feuille de modèle et conserve ses autorisations de modification; il s'agit d'une feuille protégée avec des plages non protégées (avec cette réponse ). J'essaie de combiner les deux pour que chaque copie du modèle utilisant les données source dispose des mêmes autorisations que la feuille de modèle. Je ne peux pas trouver comment imbriquer une fonction dans une autre. Les deux fonctions de script sont:

1)

function createTeamSheets() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

// Get the range of cells that store the data.
  var teamDataRange = ss.getRangeByName("SheetName");
  var teamObjects = teamDataRange.getValues();

  var template = ss.getSheetByName('TemplateTeamSheet');

  for (var i=0; i < teamObjects.length; i++) {

    // Put the sheet you want to create in a variable
    var duplicate = ss.getSheetByName(teamObjects[i]);

    // Check if the sheet you want to create already exists. If so,
    // log this and loop back. If not, create the new sheet.

                if (duplicate) {
           Logger.log("Sheet " + teamObjects[i] + "already exists");
        } else {

          if (teamObjects[i] == '') {
           break;
        } else {
           template.copyTo(ss).setName(teamObjects[i]);
           }
        }
  }

  return;
} 

et 2)

function duplicateProtectedSheet() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 
  template = ss.getSheetByName("TemplateTeamSheet");
  duplicate = template.copyTo(ss).setName("My Copy");

  var p = template.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
  var p2 = duplicate.protect();
  p2.setDescription(p.getDescription());
  p2.setWarningOnly(p.isWarningOnly());  
  if (!p.isWarningOnly()) {
    p2.removeEditors(p2.getEditors());
    p2.addEditors(p.getEditors());
    p2.setDomainEdit(p.canDomainEdit()); //  only if using an Apps domain 
  }
  var ranges = p.getUnprotectedRanges();
  var newRanges = [];
  for (var i = 0; i < ranges.length; i++) {
    newRanges.Push(duplicate.getRange(ranges[i].getA1Notation()));
  } 
  p2.setUnprotectedRanges(newRanges);

}  

Comment utiliser les variables p et p2 de la deuxième fonction dans la première fonction afin que chaque instance de template.copyTo (ss) .setName (teamObjects [i]) préserve les autorisations de la feuille de modèle?

1
user1608180

Deviner

function createTeamSheets() {
  var ss        = SpreadsheetApp.getActiveSpreadsheet();

// Get the range of cells that store team data.
  var teamDataRange = ss.getRangeByName("SheetName");
  var teamObjects = teamDataRange.getValues();

  var template = ss.getSheetByName('TemplateTeamSheet');

  for (var i=0; i < teamObjects.length; i++) {

    // Put the sheet you want to create in a variable
    var duplicate = ss.getSheetByName(teamObjects[i]);

    // Check if the sheet you want to create already exists. If so,
    // log this and loop back. If not, create the new sheet.


        if (duplicate) {
           Logger.log("Sheet " + teamObjects[i] + "already exists");
        } else {

          if (teamObjects[i] == '') {
           break;
        } else {
           template.copyTo(ss).setName(teamObjects[i]).showSheet();


var duplicatesheet = ss.getSheetByName(teamObjects[i]);


var p = template.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];          
var p2 = duplicatesheet.protect();

  p2.setDescription(p.getDescription());
  p2.setWarningOnly(p.isWarningOnly());  
  if (!p.isWarningOnly()) {
    p2.removeEditors(p2.getEditors());
    p2.addEditors(p.getEditors());
    p2.setDomainEdit(p.canDomainEdit()); //  only if using an Apps domain 
  }
  var ranges = p.getUnprotectedRanges();
  var newRanges = [];
  for (var i = 0; i < ranges.length; i++) {
    newRanges.Push(duplicatesheet.getRange(ranges[i].getA1Notation()));
  } 
  p2.setUnprotectedRanges(newRanges);


        }
        }          
}  
return;
}
0
user1608180