Dans une feuille de calcul Google appelée Présence, il y a une feuille appelée Modèle . L'utilisateur duplique cette feuille, renomme la feuille avec la date actuelle et utilise cette feuille pour marquer la présence des étudiants. La feuille de modèle contient des cellules protégées et la présence est marquée en entrant le numéro d'identification de l'élève dans l'espace donné (cellules non protégées). J'utilise le script suivant pour dupliquer plusieurs feuilles et les renommer tous les jours:
function createDailyAttendance() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var refss = ss.getSheetByName("DataPointers");
// Get the range Row and Column information.
var dataRangeRow = refss.getRange("K2").getValue();
//var dataRangeCol = ss.getRangeByName(ColName).getValue();
// Get the range of cells that store Duplicate sheet name.
var AttendanceDataRange = refss.getRange(dataRangeRow);
var AttendanceObjects = AttendanceDataRange.getValues();
var template = ss.getSheetByName('Template');
for (var i=0; i < AttendanceObjects.length; i++) {
// Put the sheet you want to create in a variable
var sheet = ss.getSheetByName(AttendanceObjects[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 (sheet) {
Logger.log("Sheet " + AttendanceObjects[i] + "already exists");
} else {
template.copyTo(ss).setName(AttendanceObjects[i]);
}
}
return;
}
Ce script m'aide à créer plusieurs copies de feuilles à partir du modèle, mais les copies en double ne conservent pas les autorisations Cellule / Plage. Existe-t-il un moyen d'ajouter une fonction de boucle qui extrait l'autorisation du modèle et l'applique chaque fois que la boucle template.copyTo
crée une feuille?
Réponses:
Scénario 1: le modèle est une feuille protégée avec des plages non protégées
Dans le script ci-dessous, je duplique la feuille, j'obtiens sa protection de type Feuille, puis je protège la nouvelle feuille de la même manière: même description, même type. Si la protection n'est pas seulement un avertissement, supprimez tous les éditeurs et ajoutez ceux autorisés pour la feuille d'origine. Enfin, parcourez les plages non protégées, remappez chacune d'entre elles (via
getA1Notation
) à la nouvelle feuille et déprotégez-les.Scénario 2: le modèle est une feuille avec des plages protégées
En utilisant la
sheet.getProtections
méthode, vous pouvez obtenir le tableau de protections sur une feuille donnée, et les boucler, créant leurs analogues sur la feuille cible. C'est quelque peu ennuyeux car il ne semble pas y avoir de méthode pour cloner simplement une protection vers une autre plage. (On peut changer la plage de protection, mais cela la déplacerait vers la nouvelle plage, au lieu de la copier.)Donc, dans la fonction ci-dessous, je fais ce qui suit:
p.getRange().getA1Notation();
p2 = sheet2.getRange(rangeNotation).protect();
p2
fonction des propriétés de la protection d'originep
.Il est également possible d'avoir des plages protégées dans une feuille protégée, auquel cas vous devrez combiner les deux fonctions (faites tout ce que chacune d'entre elles fait, sauf bien sûr que vous ne dupliquerez la feuille qu'une seule fois.)
la source
TypeError: Cannot call method "protect" of null
. Je reçois cette erreur car à partir de cette lignevar p2 = sheet.protect();
.sheet2.protect();
? Ensuite, cela signifie que sheet2 est nul, vous devez donc regarder la ligne où il est défini.var sheet = ss.getSheetByName(AttendanceObjects[i]);