Affiche date automatiquement sur 52 Semaines

Hello,

Bien vu Alexander. Je suis trop nul, je n'avais pas vu.
J'ai encore plein d'idées pour développer le fichier mais je vais essayer par moi-même et arrêter de vous solliciter.

Juste encore une question : est-ce que vous avez des idées sur des références, des livres ou des sites pour approfondir mes connaissances en Script pour Sheets? Et si possible en français.

Encore merci.

Hello, il y a ce site, le même que celui où tu as posté ce sujet mais en sheet.

https://www.sheets-pratique.com/

Hello,
J'utilise ton script, il est vraiment top.

Je voudrais maintenant ajouter une option au menu mais je galère.
Je souhaiterai garder un historique des semaines cachées sur 20 semaines.
1. je n'ai besoin d'avoir un historique que sur 20 semaines. Et, garder plus, ça surcharge pour rien.
2. si je garde l'historique pour un an, lors de la création d'une nouvelle semaine, mon script "ajouter semaine" constate qu'il y a 2 fois la même semaine et il plante.
ex. la sem. 01 de l'année passée est masquée et lorsque je crée une nouvelle sem. 1 pour cette année, mon script constate qu'elle existe déjà.
3. ou alors, on peut demander à un script que lorsqu'il constate qu'une semaine existe déjà, il remplace l'ancienne.

Merci.

Pour supprimer ...

function supprimer() {
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  var today = new Date() 
  feuilles.forEach(function(feuille){
    if (feuille.getName()!='Template'){
      var d = new Date(feuille.getRange('J3').getValue())
      if ( (today - d)/1000/60/60/24 > 140 ){
        doc.deleteSheet(feuille)
      }
    }
  })
}

140 étant 20 fois 7 jours

(je n'ai pas complètement testé)

Super,

ça marche. J'ai ajouté des semaines fictives et j'en ai mis quelques unes en plus. Le script fonctionne. Top.

J'aimerais juste bien comprendre le calcul de cette ligne : (today - d)/1000/60/60/24 > 140.

J'ai encore plein de questions :
1. Comment ajouter automatiquement des semaines (sachant que j'aimerais en avoir 20 d'avance càd 20 vertes)?
Et que la cellule B3 (qui contient le n° de semaine se complète aussi automatiquement (peut être en utilisant celle reprise dans le nom de feuille?).
2. Comment figer ma mise en forme des mes tableaux mais laisser l'accès pour remplir les cellules? (avec Excel c'est possible mais avec Sheets?).

Je vais prochainement tester avec 2 utilisateurs : un gestionnaire et un étudiant. Je vous tiendrai au courant.

Encore Merci.

J'aimerais juste bien comprendre le calcul de cette ligne : (today - d)/1000/60/60/24 > 140.

today (aujourd'hui) et d sont en millisecondes

/1000/60/60/24 ramène cela en jours

et compare à 20 semaines de 7 jours = 140

J'ai encore plein de questions :

1. Comment ajouter automatiquement des semaines (sachant que j'aimerais en avoir 20 d'avance càd 20 vertes)?
Et que la cellule B3 (qui contient le n° de semaine se complète aussi automatiquement (peut être en utilisant celle reprise dans le nom de feuille?).
2. Comment figer ma mise en forme des mes tableaux mais laisser l'accès pour remplir les cellules? (avec Excel c'est possible mais avec Sheets?).

1- tu n'avais pas une fonction pour le faire ?

2- pas compris ! le point 2 ne le fait pas ?

1. oui, mais le gestionnaire doit clicker sur un bouton pour lancer le script. Je voudrais que cela soit automatique. Càd qu'il y ait à chaque fois, 20 semaines affichées.

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()); 
   }
  }
} 

2. J'ai des étudiants qui peuvent compléter des cellules mais je constate que certains modifient la mise en forme de mon tableau : écriture, couleur, la grille du tableau effacée,...

Pour le 1/ il faudrait demander au scripteur de l'adapter ... (je vais quand même regarder si je peux créer une boucle)

Pour le 2/ que souhaites-tu faire ? de toute façon je suis incompétent sur le plan des protections il faudrait refaire un topic sur le sujet.

Pour le 1/ j'ai commencé mais

  • c'est plus complexe qu'il n'y paraît car il faut déterminer le n° de semaine qui est le déterminant et
    • il faut déterminer année et semaine en fonction de la date et non l'inverse
    • il peut y avoir des semaines 53
    • il peut y avoir des semaines 1 de l'année n+1 qui commencent fin d'année n
  • le temps de traitement de la macro est assez long (voir celui qui l'a faite) et donc il y a un risque de ne pas aller au bout quand on bouclera 20 fois dessus

sincèrement, pour avoir un automatisme qui ne se fera qu'une fois par semaine, ma macro va être bien complexe.

Donc pour ma art, cela sort du champ que je m'étais fixé. Mais tu peux reposter un sujet.

Bonjour à tous.

Concernant le 2/

@Nake259

J'ai vu que tu as déjà protégé tes feuilles ainsi que tes mises en formes

2. J'ai des étudiants qui peuvent compléter des cellules mais je constate que certains modifient la mise en forme de mon tableau : écriture, couleur, la grille du tableau effacée,...

Peut-être n'a tu pas bien configuré tes paramètres,

1) Donnée> protéger des feuilles et des plages> Ajouter une feuille ou plage> Feuille> Exclure certaine cellules

Là tu peux choisir uniquement les cellules qui peuvent être modifier par tes étudiants.

ATTENTION : certain script ne fonctionne pas avec cette méthode mais n'altère rien si tu le fais, si le script ne fonctionne pas tu peux toujours supprimer la protection et voir si il existe une autre solution.

Un tout grand merci à vous 2. Vous m'avez bien aidé.

Je vais poster un nouveau topic et chercher sur le web.

A bientôt.

Bonjour,

J'ai encore un p'tit problème avec la partie du script "function ajoutEtudiant()".
J'ai besoin que l'ajout d'un prénom n'affecte que la colonne A (A5:A45) car les autres colonnes sont protégées pour les utilisateurs et le contenu s'adapte automatiquement en fonction du contenu de la colonne A.

Avec la partie du script "function suppEtudiant()", j'ai réussi à y arriver mais pour la 1ère, je galère. Merci.

Voici le script :

function onOpen() {
  var ui = SpreadsheetApp.getUi();
  ui.createMenu('⇨ MENU  PLANIFICATEUR ⇦')
    .addItem('👉 Masquer les semaines passées', 'masquer')
    .addItem('👉 Afficher les semaines passées', 'toutAfficher')
    .addItem('👉 Supprimer historique superflu', 'supprimer')
    .addSeparator()
    .addItem('👉 Ajouter un étudiant sur toutes les feuilles', 'ajoutEtudiant')
    .addItem('👉 Supprimer un étudiant de toutes les feuilles', 'suppEtudiant')
    .addItem('👉 Trier la liste étudiants de la feuille active','trierEtudiant')
    .addToUi();
  masquer();

  // test pour lancer automatiquement la clôture : lancer une fonction dans une autre fonction
  //var classeur = SpreadsheetApp.getActiveSpreadsheet();
  //var celluleE1 = classeur.getrange ("E1").getValue();
  //if celluleE1 = "Clôturez la semaine".......
}

function masquer() {
  // la comparaison se fait sur la date en J3
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  var today = Utilities.formatDate(new Date, "GMT+1", "yyyy-MM-dd") 
  feuilles.forEach(function(feuille){
    if (feuille.getName()!='Template'){
      var d = Utilities.formatDate(feuille.getRange('J3').getValue(), "GMT+1", "yyyy-MM-dd")
      if (!feuille.isSheetHidden() && d<today){feuille.hideSheet()}
    }
  })
}

function toutAfficher(){
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  feuilles.forEach(function(feuille){
    if (feuille.isSheetHidden()){feuille.showSheet()}
  })
}

function supprimer() {
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  var today = new Date()
  feuilles.forEach(function(feuille){
    if (feuille.getName()!='Template'){
      var d = new Date(feuille.getRange('J3').getValue())
      if ( (today - d)/1000/60/60/24 > 140 ){
        doc.deleteSheet(feuille)
      }
    }
  })
}

function ajoutEtudiant() {
  const nom = Browser.inputBox("Ajouter un étudiant", 'Entrez le nom et patientez un instant SVP...', Browser.Buttons.OK_CANCEL);
  if (nom=='cancel'){return}
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  msg = ''
  feuilles.forEach(function(feuille){
    var der = feuille.getLastDataRow()
    var liste = feuille.getRange('A5:A'+der).getValues().join().split(',')
    if (liste.indexOf(nom)==-1){
      feuille.getRange('A'+(der+1)).setValue(nom)
      trier(feuille,1,5)
    }
    else {msg+=feuille.getName()+', '}
  })
  if (msg==''){msg = 'Ajout terminé avec succès !'}
  else {msg = '"' + nom + '" est déjà présent dans : ' + msg}
  Browser.msgBox(msg)
}

function suppEtudiant() {
  const nom = Browser.inputBox("Supprimer un étudiant", 'Entrez le nom et patientez un instant SVP...', Browser.Buttons.OK_CANCEL);
  if (nom=='cancel'){return}
  var doc=SpreadsheetApp.getActiveSpreadsheet()
  var feuilles=doc.getSheets()
  msg = ''
  feuilles.forEach(function(feuille){
    var der = feuille.getLastDataRow()
    var liste = feuille.getRange('A5:A'+der).getValues().join().split(',')
    if (liste.indexOf(nom)!=-1){
      var ligne = liste.indexOf(nom) + 5
      feuille.getRange('A'+ligne).clearContent()
      trier(feuille,1,5)
    }
    else {msg+=feuille.getName()+', '}
  })
  if (msg==''){msg = 'Suppression terminée avec succès !'}
  else {msg = '"' + nom + '" est absent dans : ' + msg}
  Browser.msgBox(msg)
}

Object.prototype.getLastDataRow = function(col){
  var lastRow = this.getLastRow();
  if (col == null){col='A'}
  var range = this.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }  
}

function trier(feuille,colonne,depuisLigne){
  var range = feuille.getRange(depuisLigne, 1, feuille.getLastRow() - (depuisLigne-1), feuille.getLastColumn());
  range.sort({column: colonne, ascending: true});

}

function trierEtudiant() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('A5:A45').activate();
  spreadsheet.getActiveSheet().sort(1, true);
}

Rectification : AjouterEtudiant et SupprimerEtudiant ne fonctionnent pas. Ces 2 scripts ajoutent ou effacent la ligne mais je n'ai besoin que de la colonne A (de A5 à A45) qui soit affectée.
En effet, le reste de la ligne est importé. Quand on efface un prénom, le reste s'efface automatiquement.

Merci.

Bonjour,

Rectification : AjouterEtudiant et SupprimerEtudiant ne fonctionnent pas. Ces 2 scripts ajoutent ou effacent la ligne mais je n'ai besoin que de la colonne A (de A5 à A45) qui soit affectée.
En effet, le reste de la ligne est importé. Quand on efface un prénom, le reste s'efface automatiquement.

Merci.

Ta remarque m'étonne car si je lis les scripts, ils n'affectent que la colonne A

function ajoutEtudiant() {

      feuille.getRange('A'+(der+1)).setValue(nom)

}

function suppEtudiant() {

      feuille.getRange('A'+ligne).clearContent()

}

j'ajoute que ce n'est pas très heureux de continuer à travailler sur un sujet clos et dont l'objet était différent!

En fait, le script

Ajoute bien le prénom sur la 1ère feuille,
Il trie également correctement sur la 1ère feuille.

Puis, il donne un message d'erreur : "Exception: Vous tentez de modifier une cellule ou un objet protégés. Si vous avez besoin d'effectuer cette modification, demandez au propriétaire de la feuille de calcul de supprimer la protection"

Je pense que le problème dois venir dans la partie du tri alors?

Et toutes mes excuses Stelson pour ta dernière remarque
Je ne sui spas habitué aux forums mais je tiens compte de ta remarque pour le futur. Merci.

Puis, il donne un message d'erreur : "Exception: Vous tentez de modifier une cellule ou un objet protégés. Si vous avez besoin d'effectuer cette modification, demandez au propriétaire de la feuille de calcul de supprimer la protection"

Je pense que le problème dois venir dans la partie du tri alors?

dans ce cas, essaie ceci

function trier(feuille,colonne,depuisLigne){
  var range = feuille.getRange(depuisLigne, 1, feuille.getLastRow() - (depuisLigne-1), 1);
  range.sort({column: colonne, ascending: true});
}

si cette fonction n'est utilisée que dans ces 2 situations

J'ai trouvé d'où vient le problème,
En fait quand j'utilise mon script pour ajouter de nouvelles semaines, il ajoute bien les protections là où il faut MAIS il n'ajoute pas l'adresse mail de celui qui peut modifier les cellules A5:A45 => quand on fait le tri, l'ajout de student ou la suppression, ça plante.
Il faudrait pouvoir ajouter une adresse mail (ex. jamesbond007@gmail.com) qui aurait accès aux cellules A5:A45.
Voici la partie de mon script qui ajoute les semaines :

function DuplicateSheetWithProtectionsAutomatic() {

// Ce script se déclenche automatiquement les jeudis entre 4h et 5h du matin (via déclencheur ou trigger)

  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var date = new Date();
  // boucle qui affiche 6+1 semaine qui contiennent 'Sem.'
  for (var j = 0; j < 10; j++) {
    // 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()); 
        }
      }
    } 
  }
};

// IL FAUT AJOUTER UN EDITEUR

// Source : https://weeknumber.com/how-to/javascript
//  Renvoie la date sous format ISO.
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);
}
// Renvoie l'année sous le format AAAA (à quatre chiffres) correspondant à la semaine ISO de la date.
Date.prototype.getWeekYear = function () {
  var date = new Date(this.getTime());
  date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7);
  return date.getFullYear();
}

SUPER : j'ai trouvé.

Il semble que cela provienne d'une faille de Google Sheets.
En trifouillant avec un collègue, on a simplement retiré l'accès aux éditeurs et terminé en validant. Puis redonné accès et le tour est joué. ça marche.
On a rien touché au script.

Voilà pour ceux qui auraient le même problème que moi avec les autorisations et accès.

Merci à tous ceux qui m'ont aidé de près ou de loin ET surtout pour votre patience.
Je clôture là ce post.

Rechercher des sujets similaires à "affiche date automatiquement semaines"