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