Ajout automatique semaine feuille

Bonjour à tous,

Je souhaite avoir 15 feuilles (15 semaines) présentes dans mon fichier.
C'est-à-dire n'avoir que la semaine en cours + 2 autres (se sont les semaines déjà planifiées pour l'horaire de mes étudiants) + 15 semaines en vert (sans devoir cliquer sur le bouton ajouter semaine).
Voici mon fichier : https://docs.google.com/spreadsheets/d/1ObpHc-2mZOJN7OiRmISdTx4lay_s3oau53jqQBhgqWY/edit?usp=sharing
Il s'agit d'un fichier avec des données aléatoires (un fichier test).

Merci.

Voici mon code, il ajoute manuellement une semaine.
Je dois cliquer sur "Ajout semaine", renommer la feuille avec le n° de semaine et adapter le contenu de la cellule : B3 (avec de nouveau le n° de semaine).
Je souhaite donc automatiser tout ça et utiliser un déclencheur (vendredi 3h du matin).
L'utilisateur n'a donc rien à faire.

Merci.

function duplicateSheetWithProtections() {

var spreadsheet = SpreadsheetApp;
var ss = spreadsheet.getActiveSpreadsheet(); 
  sheet = ss.getSheetByName('Template');
  sheet2 = sheet.copyTo(ss).setName('✅ Sem. ').setTabColor('#00ff00');
  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(p2.getEditors()); 
   }
  }

}

Ton script ci-dessus est extrêmement long !!

En partant de là ...

function massDuplicateSheetWithProtections() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var date = new Date();
  for (var i = 0; i < 15; i++) {
    // lundis
    date.setDate(date.getDate() + 7 - date.getDay() + 1)
    var sheetName = 'Sem. ' + date.getWeek()
    if (ss.getSheetByName('✅ ' + sheetName) == null && ss.getSheetByName('⛔ ' + sheetName) == null) {

      sheet = ss.getSheetByName('Template');
      sheet2 = sheet.copyTo(ss).setName('✅ ' + sheetName).setTabColor('#00ff00');
      sheet2.getRange('A2').setValue(date.getWeekYear())
      sheet2.getRange('B3').setValue(date.getWeek())
      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(p2.getEditors());
        }
      }

    }
  }
};

// Source: https://weeknumber.com/how-to/javascript
// Returns the ISO week of the date.
Date.prototype.getWeek = function () {
  var date = new Date(this.getTime());
  date.setHours(0, 0, 0, 0);
  // Thursday in current week decides the year.
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  // January 4 is always in week 1.
  var week1 = new Date(date.getFullYear(), 0, 4);
  // Adjust to Thursday in week 1 and count number of weeks from date to week1.
  return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7);
}
// Returns the four-digit year corresponding to the ISO week of the date.
Date.prototype.getWeekYear = function () {
  var date = new Date(this.getTime());
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  return date.getFullYear();
}

Merci Steelson.

Mais il doit y avoir un petit problème avec la boucle. Il ma ajouté 33 feuilles puis je reçois un message que la durée est trop longue et le script s'arrête.
Pour le reste, tout s'adapte bien.

33 feuilles !!! pas possible car j'ai mis

(var i = 0; i < 15; i++)

donc il ne peut pas en ajouter plus ...

Pour la durée, il faut revoir ton code, néanmoins, une fois mis en place, si tu l'actives une fois par semaine il n'y en aura qu'une à ajouter !

J'ai fait tourner plusieurs fois ce code réduit

function massDuplicateSheetWithProtections() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var date = new Date();
  for (var i = 0; i < 15; i++) {
    // lundis
    date.setDate(date.getDate() + 7 - date.getDay() + 1)
    var sheetName = 'Sem. ' + date.getWeek()
Logger.log(sheetName)
    if (ss.getSheetByName('✅ ' + sheetName) == null && ss.getSheetByName('⛔ ' + sheetName) == null) {

      sheet = ss.getSheetByName('Template');
      sheet2 = sheet.copyTo(ss).setName('✅ ' + sheetName).setTabColor('#00ff00');
      sheet2.getRange('A2').setValue(date.getWeekYear())
      sheet2.getRange('B3').setValue(date.getWeek())

// ici le code très chronophage sur les protections

    }
  }
};

il s'arrête bien semaine 24 ... et il n'a ajouté que le nécessaire en plus des feuilles que j'avais laissées

Merci.

J'ai compris d'où vient le problème : tu utilises une variable que j'utilise aussi dans le reste de mon script.
J'ai adapté... et ça marche au top.
un tout grand merci pour ton aide.

J'ai placé d'autres post :
"Bloquer la mise en forme autoriser la modification du contenu"
"Comment supprimer menu barre tache editeur lecteur"

Je commence avec le script. Si tu as des idées, des sites,... pour que je puisse apprendre, je suis preneur.

Encore un tout grand merci.

Rechercher des sujets similaires à "ajout automatique semaine feuille"