Réagencement de données en fonction du colonne date de référence

Bonjour,

J'ai n tableaux de données, tous possédant des leurs dates extractions, je souhaiterais en fonction du numéro de colonne de la donnée pouvoir reclasser les données en fonction de ma colonne date de référence.

Exemple : la colonne A est ma colonne date de référence commençant au 15/07/2021. La colonne CC par exemple commence 22/10/2021, si je sélectionne cette colonne CC par le numéro de colonne , j'aimerais pouvoir reclasser les données d'une des 3 colonnes "value" au choix en fonction de la colonne date de référence c'est à dire recopier la colonne date référence et écrire les données à partir de la date de début. pour la colonne CC aurait 0 ou vide pour les dates allant de 15/07/2021 au 21/10/2021 et pour le reste des dates la donnée les données de CC.

J'ai créé un script fonctionnel, mais le temps d'exécution de 23 à 33 second en fonction du numéro de colonne sélectionné. le script est dans le fichier

Le format date peut être différents entre la date de référence et les autres date des n tableaux. j'ai besoin d'aide sur cette nouvelle problématique de temps de calcul.

Voici un fichier exemple :

https://docs.google.com/spreadsheets/d/1mEnLNpGGizoo6hUw5fQUK3G_jSArfWfcNAJMphtJw38/edit?usp=sharing

Merci d'avance

Bonjour,

j'aimerais pouvoir reclasser les données d'une des 3 colonnes "value" au choix en fonction de la colonne date de référence c'est à dire recopier la colonne date référence et écrire les données à partir de la date de début. pour la colonne CC aurait 0 ou vide pour les dates allant de 15/07/2021 au 21/10/2021 et pour le reste des dates la donnée les données de CC.

en 2 secondes

function myFunction() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hist.Taux");

  // On récupère les données de la colonne choisie que l'on range dans un dictionnaire dont la cé est la date
  var data = sheet.getRange('CC4:CF' + sheet.getLastRow()).getValues()
  var dico = new Map()
  data.forEach(r => dico.set(formatDate(r[0]), r[1] + '|' + r[2] + '|' + r[3]))

  // On prend ici les dates de référence
  var result = []
  var reference = sheet.getRange('A4:A' + sheet.getLastRow()).getValues()
  // On leur affecte les données du dicyionnaire sir la clé existe, sinon un triple 0
  reference.forEach(r => {
    var d = formatDate(r[0])
    if (dico.has(d)) {
      x = dico.get(d).split('|')
      result.push([d, x[0], x[1], x[2]])
    }
    else {
      result.push([d, 0, 0, 0])
    }
  })

  // on reporte le résultat
  SpreadsheetApp.getActiveSpreadsheet().getSheetByName("TEST").getRange('A4:d' + sheet.getLastRow()).setValues(result)

}
function formatDate(d){
  return Utilities.formatDate(new Date(d), "GMT+1", "yyyy-MM-dd")
}

Bonjour,

Hier grâce à Steelson , j'ai pu trouvé une solution qui donne satisfaction sur le temps de calcul en corrigeant le Script, il permet de réaliser le réagenecement de données en fonction de la date. Voici le script :

function myTranspose_at_date(mynumberCol) {
 if (typeof mynumberCol == 'undefined') {
     mynumberCol=9;
  } 
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Hist.Taux");
  var data = sheet.getRange('A4:DH' + sheet.getLastRow()).getDisplayValues();
  var col = 0
   const start = new Date();
  var valuedeI =0;
  var tampon_VAL =[0];
  var dates = new Map()
   // map va constituer une sorte de répertoire de dates uniques avec des valeurs
  // 3 méthodes : .set , .has , .get

  for (ligne_ref = 0; ligne_ref < data.length; ligne_ref++) 
    {
        ladate_ref = Utilities.formatDate(new Date(data[ligne_ref][col]), "GMT+1", "yyyy-MM-dd")
       dates.set(ladate_ref);

        for (ligne = 0; ligne < data.length; ligne++) 
          {
           if (data[ligne][mynumberCol-1] != '') 
              {
                if (data[ligne][mynumberCol-1]==data[ligne_ref][col])
                  {
                    dates.set(ladate_ref, data[ligne][mynumberCol]);
                  }
              }
          }
    }
  var sommes = []
  // on mets ici le répertoire en tableau que l'on va trier
  dates.forEach(function (value, key) { sommes.push([key, value]) })
  sommes = (sommes.sort())

  // on transfère
  const comp =       SpreadsheetApp.getActiveSpreadsheet().getSheetByName("compare");
  comp.getRange('I2:J' + (sommes.length + 1)).setValues(sommes)

  const current = new Date();
  const elapsedTime = current.getTime() - start.getTime();
  console.log("Il a fallu "+elapsedTime+" ms pour lire les valeurs de la première colonne");
}

temps exécution 150ms max,

Merci encore Steelson

Rechercher des sujets similaires à "reagencement donnees fonction colonne date reference"