Problème de rafraichissement des données, qui ne se trie pas

Bonsoir à tous mordu de tableur,

J'ai un projet presque finalisé, il me reste une chose que je n'arrive pas a trouvé après avoir chercher des heures he oui toute l'après midi et rien .

Pourtant le principe de google Sheets est bien le partage de donné, donc si sur mon tableau j'ai une colonne (en réalité il y en a 12) mais une à la fois puisque une par moi, lorsque une donnée y est ajouter ou retirer la colonne devrait se mettre à jour et refaire le tri.

Mais ce ne se passe pas, alors oui j'ai essayer les déclencheurs rien non plus.

Ce qui me faudrait c'est la formule pour rafraichir une fois une cellule modifiée ou alors toute les 5 minute comme le déclencheur devrait le faire.

Donc pour chaque mois (dans le fichier c'est "Evénement" ) il y a un script mais ce ne sera pas moi qui choisirais celui qu'il mettra.

Donc le rafraichissement devrait fonctionner avec la dernière macro utilisée petit plus la macro utilisée en dernier lieu aura sa cellule en jaune.

Pour les déclencheurs peut on mettre un déclencheur par mois sachant qu'il n'y aura qu'une seule colonne qui devra toujours être à jour celle en "jaune"

image

exemple le dernier "Présent " n'est pas remis avec les autres donc si un autre internaute le remplis le chiffre 12 dans la colonne de gauche ne sera plus juste puisse qu''il y aura 13 participant et non 12.

Une autre solution serait que la mise en forme de la cellule "E4" s'il y a changement se remette en blanc.

https://docs.google.com/spreadsheets/d/1StuNNzfJ7b_uqTYk3uJEQnMhkHj9rjWJ68Qrbg7-TCY/edit?usp=sharing

Merci pour votre éventuelle solution

mbell

Bonjour,

si je comprends bien, le calcul est fait par un script.

Pourquoi ne pas le faire avec une formule, ce qui aurait l'avantage de mettre à jour automatiquement ? même si cette colonne est variable, on peut le faire avec indirect.

Question subsidiaire : comment sont introduites les données ?

Bonjour Steelson,

si je comprends bien, le calcul est fait par un script.

oui mais il n'y pas de calcul juste des tris, le premier sur la colonne choisie qui c'est vrai pourrait être choisie via une certaine date

image

en ligne 3.

après il faut trier sur le nombre de présence colonne "E"

image

puis le handicap colonne "C" ensuite sur le nom puis le prénom d'où un script qui fait tout ça .

Pourquoi ne pas le faire avec une formule, ce qui aurait l'avantage de mettre à jour automatiquement ? même si cette colonne est variable, on peut le faire avec indirect.

Parce que je ne suis pas informaticien je peux éventuellement essayer d'adapter l'une ou l'autre formule si ce n'est pas trop compliquer mais en créer une ???

Question subsidiaire : comment sont introduites les données ?

Les cases sont validées par une liste déroulante avec deux variable : "Présent ou Absent".

Mais tu as déjà travailler sur ce fichier.

Pour la formule voilà les critères demandé:

Choix de date dans la ligne « 3 » : si la date est passé masquée la colonne, ensuite trier sur « présent ou absent », ensuite suivant ce tri trier la colonne « E » de plus petit au plus grand, ensuite sur la colonne « A » du a à z, et pour finir sur la colonne « B ».

Est-ce une formule réalisable ?

D’un autre côté les scripts fonctionneraient toujours même s’il y a formule.

Car il faut pouvoir avoir accès au semaine précédente afin de retrouver des présences exemple on est en date 6 et je voudrais savoir qui était là en date 2 (avec les tris bien sûr)

Si c’est faisable je suis preneur.

Merci d'avance pour ton aide Steelson

mbell

C'est tellement complexe ton code !!

Peux-tu me dire où est calculé le chiffre 12 de E4 ?

dans les colonnes cachées après o soit dans ce cas la colonne"x"

re: Bien sûr si une formule peut faire le travail plus tôt que de faire à ma façon mais il le fait sans trop de formule c'est aussi à cause des tris nécessaire.

merci pour ton aide Steelson.

Je vois que tu es sur le formulaire la colonne 6 et 7 on les même date c'est normal des fois deux cours le même jours un le matin et l'autre l'aprés -midi garde seulement le matin comme tri premier

Tu as fait un très gros travail ... pour la suite ou le prochain, essaie de simplifier (pas d'activate()) et de paramétrer pour rassembler toutes les fonctions en une seule. Mais au moins tu as pas mal manipulé du javascript !

Pour ne pas tout remettre en cause, tu peux ajouter ceci

function onEdit(e) {
  if (e.range.getColumn() > 5 && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}

cela relancera la fonction Dx en cas de changement.

Re Steelson,

C'est en manipulent la fonction "Enregistrer une macro" mais il y a des fonction qu'il ne fait pas.

J'ai compris le code, saurais tu quel est la formule pour afficher la colonne correspondante le plus prêt d'une date si 15/6/2022 afficher que les colonne avant cette date soit masquée.

pour rendre les formules encore plus courte

Merci pour ta patience Steelson

mbell

Re: Steelson,

il y a un soucis la formule est super, mais si je modifie une cellule en colonne 10 par exemple l'utilisateur ne sait pas revenir en arrière.

En fait le problème est plus simple il ne faut mettre à jour la liste que si une cellule de la rangée affichée en premier est modifier (juste celle qui sera affichée après la colonne "E") les autres colonnes ne sont pas importante rien que la colonne choisie en premier ou mieux encore choisie par rapport à la date en "A1".

Si tu sais comment faire car le travail serait finit pour moi grâce à toi steelson merci beaucoup.

mbell

pour limiter à cette seule colonne

function onEdit(e) {
  if (e.range.getColumn() == rechercheDate() && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}
function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 1)
}

Bonjour Steelson,

tu as veillé tard hier soir

il y a quelque chose qui ne vas plus

to nouveau code

function onEdit(e) {
  if (e.range.getColumn() == rechercheDate() && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}
function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 1)
}

ne fonctionne pas et en remettant l'ancien

function onEdit(e) {
  if (e.range.getColumn() > 5 && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}

même chose.

Voici où j'ai insérer le code

image

A la ligne 12 en mettant le R en majuscule la fonction est en rouge si non en noir

image

La fonction onEdit() est en grisé !? et le onOpen() en noir.

Quel est la bonne manière d'écrire ces fonctions.

Lorsque je lance la fonction rechercheDate, le script s'exécute mais rien ne change pas de curseur sur la date la plus proche ou que la colonne recherchée se déplace en position juste à coté de la liste des joueur "E".

Je comprend plus, à l'aide Steelson

mbell

tu l'as mis "dans" la fonction onOpen qui n'est pas terminée ! et onEdit n semble pas non plus terminée ... on ne voit pas le } correspondant à la déclaration de fonction.

J'ai détaché onEdit de la fonction onOpen , regarde si cela fonctionne en changeant une donnée.

edit ... je ne comprends pas ce qui se passe, car sur ma copie cela fonctionnait parfaitement ... je regarde

avec une date comme celle-ci cela ne peut pas fonctionner

image

voici le code complet Steelson

function onOpen() {
   var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
   var date = Utilities.formatDate(new Date(),"GMT", "dd/MM/yyyy"); // recherche la date
   spreadsheet.getRange("A1").setValue(date); // affiché en "A1" la date du jour 

function onEdit(e) {
  if (e.range.getColumn() == rechercheDate() && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}
function rechercheDate() {
  const sh = SpreadsheetApp.getActiveSheet();
  const d = sh.getRange('A1').getValue().valueOf()
  let col = 0
  sh.getRange('F3:P3').getValues().flat().forEach((x, i) => {
    if (x.valueOf() <= d) col = i
  })
  return (col + 5 + 1)
}

// *************************** MENU ******************************

const ui = SpreadsheetApp.getUi(); // crée le menu admin uniquement
      ui.createMenu('⇩ PARAGOLF AFGOLF ⇩')

  .addSubMenu(ui.createMenu('Admin')
     .addItem('⚠️ Création d une nouvelle saison ⚠️', 'Ns')
     .addItem('⚠️ Effacer les présences de cette saison ⚠️', 'Es')
     .addItem('⚠️ Protection de la feuille ⚠️','Ps'))  
  .addItem('Afficher tous les événements', 'Rn')
  .addItem('Recherche Date', 'rechercheDate')
  .addSubMenu(ui.createMenu('Choix d un événements')
   .addItem('🏌 1 Événement 🏌', 'D1')
   .addItem('🏌 2 Événement 🏌', 'D2')
   .addItem('🏌 3 Événement 🏌', 'D3')
   .addItem('🏌 4 Événement 🏌', 'D4')
   .addItem('🏌 5 Événement 🏌', 'D5')
   .addItem('🏌 6 Événement 🏌', 'D6')
   .addItem('🏌 7 Événement 🏌', 'D7')
   .addItem('🏌 8 Événement 🏌', 'D8')
   .addItem('🏌 9 Événement 🏌', 'D9')
   .addItem('🏌 10 Événement 🏌', 'D10')
   .addItem('🏌 11 Événement 🏌', 'D11')
   .addItem('🏌 12 Événement 🏌', 'D12'))
  // .addSeparator()
  .addSubMenu(ui.createMenu('Différents tri')
     .addItem('👉 Groupe 👈', 'Gp')
     .addItem('👉 Handicap 👈', 'HCP')
     .addItem('👉 Présences total 👈', 'Pt'))
  //  .addSeparator()

   .addToUi();

// ********************* FIN MENU ************************************

}

je ne vois pas ou je l'aurais oublier

merci pour ta vision

tu mets onEdit dans la fonction onOpen

function onOpen() {
   var spreadsheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
   var date = Utilities.formatDate(new Date(),"GMT", "dd/MM/yyyy"); // recherche la date
   spreadsheet.getRange("A1").setValue(date); // affiché en "A1" la date du jour 

// ici cette fonction n'est pas terminée, il faut mettre onEdit en DEHORS de la fonction onOpen qui se termine en bas de page

function onEdit(e) {
  if (e.range.getColumn() == rechercheDate() && e.range.getRow() >= 5 && e.range.getRow() <= 85) {
    var fonction = 'D' + (+e.range.getColumn() - 5)
    this[fonction]()
  }
}

une fonction se termine comme suit

function onOpen() {
// ...
} // c'est ceci qui manque avant de mettre une autre fonction (sauf cas particulier de récurrence)

function onEdit(e) {
// ...
}

je dois le mettre

image

dans un nouveau fichier ou dans macro, Menu ?

je l'ai mis dans un nouveau fichier de script, mais tu peux le mettre dans le module menu mais à la fin ou au début, pas au milieu d'un script comme onOpen

Rechercher des sujets similaires à "probleme rafraichissement donnees qui trie pas"