Optimiser script chronophage en fonction des dates

Bonjour à tous,

J'ai un script qui tourne bien mais qui est chronophage.
Je voudrais l'alléger en temps d'exécution et j'ai une piste : mon script peut ajouter ou supprimer des étudiants. Cependant, je n'ai pas besoin qu'il le fasse pour les semaines passées (celles qui sont masquées), c'est inutile, cela utilise des ressources pour rien et surtout chronophage (j'ai un historique de 15 semaines masquées).

La solution : Si H3 est plus petite que Date(today) alors ne rien faire sinon 'function ajoutEtudiant()' ou 'function suppEtudiant()'.
J'ai déjà essayé plusieurs pistes mais je n'arrive pas à mettre ça en musique.

Autre demande qui me turlupine : à quoi sert le ';' dans les scripts?

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

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 pré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);
      //trierEtudiant()
    }
    else {msg+=feuille.getName()+', '
    }
  })
  if (msg==''){msg = 'Ajout terminé avec succès !'}
  else {msg = '"' + nom + '" était déjà présent dans les feuilles : ' + msg}
  Browser.msgBox(msg)
}

function suppEtudiant() {
  const nom = Browser.inputBox("Supprimer un étudiant", 'Entrez le pré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()
      }
    else {msg+=feuille.getName()+', '}
    //trierEtudiant()    
  })
  if (msg==''){msg = 'Suppression terminée avec succès !'}
  else {msg = '"' + nom + '" est absent des feuilles : ' + 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:K45').activate();
  spreadsheet.getActiveSheet().sort(1, true);
}

function trierTout() {
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  ss.getSheets().forEach(sh => sh.getRange('A5:K45').sort({ column : 1, ascending: true }))
}

Merci.

Bonjour,

J'ai un script qui tourne bien mais qui est chronophage.

Je voudrais l'alléger en temps d'exécution et j'ai une piste : mon script peut ajouter ou supprimer des étudiants. Cependant, je n'ai pas besoin qu'il le fasse pour les semaines passées (celles qui sont masquées), c'est inutile, cela utilise des ressources pour rien et surtout chronophage (j'ai un historique de 15 semaines masquées).

La solution : Si H3 est plus petite que Date(today) alors ne rien faire sinon 'function ajoutEtudiant()' ou 'function suppEtudiant()'.
J'ai déjà essayé plusieurs pistes mais je n'arrive pas à mettre ça en musique.

car dans ce cas il faut aligner correctement tes paramètres régionaux entre la feuille et le script

mais d'une manière générale, ce qui ne va pas pour moi, c'est la conception générale ... pourquoi faire une feuille par semaine ? il est plus simple de tout mettre à la file et ensuite effectuer des filtres

Autre demande qui me turlupine : à quoi sert le ';' dans les scripts?

Bien souvent à rien, mais parfois indispensable dans une boucle ou dans un test où on n'aurait pas utilisé {}.

En fait, il faudrait prendre l'habitude de le mettre systématiquement justement comme en php pour terminer les instructions !

Cependant, je n'ai pas besoin qu'il le fasse pour les semaines passées (celles qui sont masquées),

Tu peux dans ce cas ajouter cette condition

  feuilles.forEach(function (feuille) {
    if (feuille.isSheetHidden()) { 
      // ici le code ajout ou suppression sur feuilles visibles uniquement 
    }
  })

Je viens de tester mais ça ne marche pas : on dirait qu'il boucle 3x et il ajoute le prénom sur toutes les feuilles même les cachées.

J'ai ajouté "===>" dans le code pour que tu puisses repérer plus facilement ;)

function ajoutEtudiant() {
  const nom = Browser.inputBox("Ajouter un étudiant : ", 'Entrez le prénom et patientez un instant SVP...', Browser.Buttons.OK_CANCEL);
  if (nom == 'cancel') { return }
  var doc = SpreadsheetApp.getActiveSpreadsheet()
  var feuilles = doc.getSheets()

===> feuilles.forEach(function (feuille) {
===>    if (feuille.isSheetHidden()) { 
===>      // ici le code ajout ou suppression sur feuilles visibles uniquement 

  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);
      //trierEtudiant()
    }
    else {
      msg += feuille.getName() + ', '
    }
  })
  if (msg == '') { msg = 'Ajout terminé avec succès !' }
  else { msg = '"' + nom + '" était déjà présent dans les feuilles : ' + msg }
  Browser.msgBox(msg)
===>}
===>})
}

il ne faut pas empiler 2 fois forEach !

feuilles.forEach(function (feuille) {
  if (feuille.isSheetHidden()) { 

  msg = ''
  feuilles.forEach(function (feuille) {

Ok, je pense avoir compris.
Il m'ajoute maintenant bien les prénoms mais uniquement sur les feuilles masquées. Il fait l'inverse de ce que j'ai besoin.

function ajoutEtudiant() {
  const nom = Browser.inputBox("Ajouter un étudiant : ", 'Entrez le pré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) {
    if (feuille.isSheetHidden()) {
    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);
      //trierEtudiant()
    }
    }
    else {
      msg += feuille.getName() + ', '
    }
  })
  if (msg == '') { msg = 'Ajout terminé avec succès !' }
  else { msg = '"' + nom + '" était déjà présent dans les feuilles : ' + msg }
  Browser.msgBox(msg)
}

donc tu inverses

if (!feuille.isSheetHidden()) 

mets ! devant

Super ça marche. Comme quoi un caractère peut faire la différence.
En tout cas, j'apprends pas mal avec ton aide et les infos de ce site.

Un tout grand Merci.

Rechercher des sujets similaires à "optimiser script chronophage fonction dates"