MakeCopy et conservation des permissions

Bonjour,

dans un script, j'aimerai conserver les permissions (Protected sheets and ranges) lorsque je crée un copie d'un fichier gsheet à l'aide d'un script :

var destSheetFile = DriveApp.getFileById(srcSheetId).makeCopy(destSheetName, destFolder);

y a t'il une option ou fonction simple pour faire cela ?

Merci pour votre aide

Bonjour,

  • Option = non
  • Façon simple = non
  • Il faut en fait récupérer les protections de la première feuille et les réinjecter dans la seconde ... je regarde la documentation et fais un test avant de répondre.

à tester

function recopieAvecPlagesProtégées() {
  var ss = SpreadsheetApp.getActiveSpreadsheet(); 

  // recopie données - mettre à jour le nom des feuilles
  var sh1 = ss.getSheetByName('source');
  var sh2 = ss.getSheetByName('destination')
  if (sh2) {ss.deleteSheet(sh2)}
  var sh2 = sh1.copyTo(ss).setName('destination'); 

  // recopie protections
  sh1.getProtections(SpreadsheetApp.ProtectionType.RANGE).forEach(p1 => {
    var p2 = sh2.getRange(p1.getRange().getA1Notation()).protect();
    p2.setDescription(p1.getDescription());
    p2.setWarningOnly(p1.isWarningOnly());
    if (!p1.isWarningOnly()) {
      p2.removeEditors(p2.getEditors());
      p2.addEditors(p1.getEditors());
   }
  })

}

bon, il s'agit ici du même fichier, je vais voir pour le faire dans un autre fichier !

Merci pour ton aide.

Je m'aperçois qu'il y a une autre solution de protection qui consiste à partir sur une feuille totalement protégée et "libérer" certaines parties. Voici le code qui prend en compte les 2 types de protection

function recopieAvecPlagesProtégées() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();

  // recopie données - mettre à jour le nom des feuilles
  var sh1 = ss.getSheetByName('source');
  var sh2 = ss.getSheetByName('destination')
  if (sh2) { ss.deleteSheet(sh2) }
  var sh2 = sh1.copyTo(ss).setName('destination');

  // recopie protections
  transfererProtections(sh1,sh2)
}

avec

function transfererProtections(sh1,sh2){
  if (sh1.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0]) {
    // cas d'une protection de feuille avec exclusion de certaines plages
    var p1 = sh1.getProtections(SpreadsheetApp.ProtectionType.SHEET)[0];
    var p2 = sh2.protect();
    p2.setDescription(p1.getDescription());
    p2.setWarningOnly(p1.isWarningOnly());
    if (!p1.isWarningOnly()) {
      p2.removeEditors(p2.getEditors());
      p2.addEditors(p1.getEditors());
    }
    var ranges = [];
    p1.getUnprotectedRanges().forEach(rng => {
      ranges.push(sh2.getRange(rng.getA1Notation()));
    })
    p2.setUnprotectedRanges(ranges);
  }
  else {
    // cas d'une protection de plages
    sh1.getProtections(SpreadsheetApp.ProtectionType.RANGE).forEach(p1 => {
      var p2 = sh2.getRange(p1.getRange().getA1Notation()).protect();
      p2.setDescription(p1.getDescription());
      p2.setWarningOnly(p1.isWarningOnly());
      if (!p1.isWarningOnly()) {
        p2.removeEditors(p2.getEditors());
        p2.addEditors(p1.getEditors());
      }
    })
  }
}

j'ai séparé la seconde partie pour l'utiliser en l'état sur la recopie des fichiers

Pour recopier un fichier avec protections ...

function recopieAvecPlagesProtégées() {
  var srcSheetId = '#########'
  var folderID = '#########'
  var destFolder = DriveApp.getFolderById(folderID)
  var destSheetName = '###############'
  var newId = DriveApp.getFileById(srcSheetId).makeCopy(destSheetName, destFolder).getId();
  var dest = SpreadsheetApp.openById(newId)
  SpreadsheetApp.openById(srcSheetId).getSheets().forEach( (sh,i) => {
    transfererProtections(sh,dest.getSheets()[i])
  })
}

avec la fonction décrite précédemment

merci beaucoup, je vais faire des tests.

etonnant que Google n'est pas prévu une option simple pour faire cela.

je suis d'accord avec toi là-dessus !

test concluant. merci.

"n'ait pas" et non "n'est pas".

merci pour ce retour ... MAIS !!

je viens de faire un essai simple

function copyWithProtectedCells() {
  var srcId = '175Rq77g2og0E00IVPBdMuD7YzZ51KhrpQCVWmryP0ns'
  var folderID = '18akqHAN7PSPMnG3h5HpCskQsMCv4TqCM'
  var destFolder = DriveApp.getFolderById(folderID)
  var destSheetName = 'test recopie avec protections'
  return DriveApp.getFileById(srcId).makeCopy(destSheetName, destFolder).getUrl();
}

et ... les plages protégées ont été conservées !!! in fine il n'y aurait pas de problèmes ?

les plages protégées sont bien conservées lors du
makecopy()

mais pas la liste des personnes ou des groupes autorisés.

ok merci pour cette précision

Rechercher des sujets similaires à "makecopy conservation permissions"