Récupération de doublons

Bonjour,

Je dois contrôler les présences sur différentes journées et vérifier qu'il n'y a pas de doublons. Mon fichier de travail initial (en csv) contient la poule, un numéro d'identification par personne ainsi que les dates des matchs sur lesquelles les personnes étaient présentes, données que j'ai récupérées par copier-coller dans mon sheet (j'ai essayé avec un tuto trouvé pour récupérer directement le csv via IMPORTDATA mais cela me provoque une erreur #N/A)

Mon fichier : https://docs.google.com/spreadsheets/d/12jSLSRE2-dHWWI4X2adKpstpLg0hVfcCNkiI9De4c_c/edit?usp=sharing

Pour trouver les doublons, j'ai multiplié le numéro d'identification et la date du match pour toutes les journées à l'aide de la formule (onglet calcul, cellules A2 à AD2)

=ArrayFormula(SI(extract_site!C2:C="";"";extract_site!$B2:$B&extract_site!C2:C))

Je calcule le nombre de où le résultat de cette multiplication existe (cellules AE2 à à BH2) :

=ArrayFormula(NB.SI($A:$AD;B2:B))

J'affiche ensuite le numéro d'identification lorsque le résultat de la formule précédente est différent de 1, qui correspond donc à la présence multiple d'une même personne à une même date grâce à

=ArrayFormula(SI(AE2:AE=1;"";GAUCHE(A2:A;NBCAR(A2:A)-5)))

Enfin, je cherche à afficher les poules qui sont en doublon pour une même personne et même date (je ne suis pas encore arrivé jusque là !)

Le problème principal de cette solution est que cela rame ce qui se comprend puisque les calculs sont compliqués. Sachant qu'en plus, en regardant bien les résultats, ils ne correspondent pas aux résultats attendus !

Je cherche donc à savoir s'il existait une méthode plus rapide et moins gourmande en calcul pour l'extraction (par journée, j'aimerais afficher les différentes poules pour lesquelles une personne a participé). Pour aller un peu plus loin, dans la réalité, l'idéal serait en fait pas de contrôler par journée (qui correspond à un we) et non par date (donc en gros de tester un doublon sur plus ou moins un jour de la date écrite (si la personne est réellement présente le samedi, elle ne doit pas être présente le samedi et le dimanche de la même journée) -> je pense que traiter les données en utilisant le numéro de semaine est une bonne solution ?

Merci d'avance pour l'aide.

Bonjour,

Une solution à tester :

function doublonsIdDates() {

  const donnees = SpreadsheetApp.getActive().getSheetByName('extract_site').getRange('B2:AF').getDisplayValues();
  const idDates = {};

  // Récupération de toutes les dates pour chaque numéro d'identification
  for (let i = 0; i < donnees.length; i++) {
    const id = donnees[i].shift();
    const tabDates = donnees[i].filter(i => i);
    idDates[id] = idDates[id]?.length ? [...idDates[id], ...tabDates] : tabDates;
  }

  // Résultat
  const tabResultat = [];
  for (const [id, tabDates] of Object.entries(idDates)) {

    // Si au moins 1 doublon
    if (tabDates.length !== (new Set(tabDates)).size)
      tabResultat.push([id, ...new Set(tabDates.filter((v, i) => tabDates.indexOf(v) !== i))]);
  }

  return tabResultat;
}
image

Cordialement,

Bonsoir,

Ca marche super, merci.

J'ai essayé de comprendre ce que fait la fonction mais il y a beaucoup trop de choses qui m'échappent.

Serait-il possible d'afficher les poules concernées plutôt que les dates (mais j'imagine que cela complique la recherche) ? Ainsi, au lieu d'avoir les dates où il y a doublon, j'obtiens directement les poules en doublon (en pratique, comme le contrôle est fait week-end par week-end, on ne contrôle que le dernier week-end donc on met de côté les précédents week-end même s'il faut garder une trace pour la vérification à posteriori) ?

D'ailleurs, peut-être qu'il serait plus judicieux, pour mes besoins, de ne comparer que les numéros de semaine correspondant aux dates (comme je l'expliquais, je cherche les doublons par "journée" correspondant à des week-end calendaires) ?

Serait-il possible d'afficher les poules concernées plutôt que les dates (mais j'imagine que cela complique la recherche) ?

Oui ça complique un peu et la fonction actuelle n'est pas vraiment idéale pour afficher les poules mais je t'ai quand même fait ça :

function doublonsIdDates() {

  const donnees = SpreadsheetApp.getActive().getSheetByName('extract_site').getRange('A2:AF').getDisplayValues().map(j => j.filter(i => i));
  const idDates = {};

  // Récupération de toutes les dates pour chaque numéro d'identification
  for (let i = 0; i < donnees.length; i++) {
    const poule = donnees[i].shift();
    const id = donnees[i].shift();
    const tabPouleDates = donnees[i].map(i => [poule, i]);
    idDates[id] = idDates[id]?.length ? [...idDates[id], ...tabPouleDates] : tabPouleDates;
  }

  // Résultat
  const tabResultat = [];
  for (const [id, tabPouleDates] of Object.entries(idDates)) {

    // Si au moins 1 doublon
    const tabDates = tabPouleDates.map(i => i[1]);
    if (tabDates.length !== (new Set(tabDates)).size)
      tabResultat.push([id, ...tabPouleDates.filter((v, i) => tabDates.indexOf(v[1]) !== i || tabDates.lastIndexOf(v[1]) !== i).map(i => `${i[0]} (${i[1]})`)]);
  }

  return tabResultat;
}
image

Merci ! Je vais essayer d'étudier le code : si je ne comprends pas tout, je reviendrai te poser des questions !

Bonjour,

Je prends enfin du temps pour me replonger dans mon projet. J'ai des bases, limitées, en programmation script (j'ai notamment consulté les tutos du site !)

J'ai regardé en détail le code et j'ai quelques questions sur la manière de fonctionner ton code :

- quel type d'objet est idDates ?

je comprends que la définition de la constante donnees permet de contenir les données des cellules A2:F dans un tableau mais par contre je ne comprends pas la partie finale map(j => j.filter(i => i))

const donnees = SpreadsheetApp.getActive().getSheetByName('extract_site').getRange('A2:AF').getDisplayValues().map(j => j.filter(i => i));

- dans la boucle for avec la variable i, je comprends que le principe est d'extraire par identifiant les couples poules/dates mais je ne comprends pas du tout la syntaxe utilisée (les points d'interrogation, les points de suspension)

- je suppose que les critères de la boucle for (const [id, tabPouleDates] of Object.entries(idDates)) balayent les enregistrements pour lesquels idDates existe correspondant donc à un doublon ?

- je ne comprends pas la syntaxe utilisée pour l'affichage des doublons

Rechercher des sujets similaires à "recuperation doublons"