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