Importer et comparer des coefficients
Bonjour,
Je suis actuellement à la deuxième étape d'un projet mais je suis bloquée..
Pour résumé, j'ai sur une feuille des paramètres (une série de chiffres) avec des coefficients directement liés à ces paramètres. J'ai dans une autre feuille d'autres paramètres (certains sont en commun avec la première feuille) avec d'autres coefficients.
Le but est de comparer, pour un même paramètre les coefficients de cette deuxième feuille avec les coefficients de la première feuille. Pour cela, j'aimerais importer les coefficients de la deuxième feuille dans les colonnes se trouvant juste à côté des coefficients dans la première feuille "CR-MR".
La petite subtilité est que certains paramètres sont sur 3 ou 4 lignes, donc quand la ligne n+1 et n+2 et n+3 sont vides (car correspondent au même paramètre en n-x), il passe au paramètre suivant sans prendre en compte les lignes vides.. donc il passe à la ligne non vide.
Voici un lien vers la feuille simplifiée ainsi qu'une partie de mon code.
Merci par avance pour votre aide précieuse.
https://docs.google.com/spreadsheets/d/12zxuXmYpC8EGjKxiYH_LIqLQlEgPAZjNxwokvFTU294/edit?usp=sharing
function IMPORT() {
var ficheVERIF = SpreadsheetApp.getActiveSpreadsheet();
var feuilleVERIF = ficheVERIF.getSheetByName("CR-MR");
var init = feuilleVERIF.getRange('D10:E').clearContent();
// se place sur la feuille 'Base' du fichier ETAL
var sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
if (sheets.length > 0) {
var Base = sheets[0];
}
//recherche des coeff A et B
var lastRow = Base.getLastRow();
var tableau = Base.getRange('A11:N'+ lastRow).getValues();
var result = []
var lastRow2 = feuilleVERIF.getLastRow();
var param = feuilleVERIF.getRange('A10:N'+lastRow2).getValues();
//importation coeff A et coeffB
for (i=0; i < tableau.length - 10; i++){
for (a=0; a < param.length - 9 ; a++){
if (param[a][0].substring(0,8) == tableau[i][0]){ //vérifie si les paramètres sont les même
if (tableau[i+1][0] !== '' && tableau[i+2][0] !== '' && tableau[i+3][0] !== ''){
//passer à la ligne suivante non vide
}
else if (tableau[i][7] !== '' && tableau[i][8] !== ''){
var coefA = tableau[i][7].substring(0);
var coefB = tableau[i][8].substring(0);
}
else if (tableau[i][9] !== '' && tableau[i][10] !== ''){
var coefA = tableau[i][9].substring(0);
var coefB = tableau[i][10].substring(0);
}
else if (tableau[i][11] !== '' && tableau[i][12] !== ''){
var coefA = tableau[i][11].substring(0);
var coefB = tableau[i][12].substring(0);
}
}
else{
var coefA = 'NO RESULT'
var coefB = 'NO RESULT'
}
result.push([[coefA], [coefB]]);
}
}
var verif_ETAL = feuilleVERIF.getRange(10,4,result.length,result[0].length).setValues(result);
}Bonjour,
j'ai pas mal de questions ...
pourquoi définir base sur la première feuille qui en plus est CR-CM, autant l'identifier par elle-même
var Base = ficheVERIF.getSheetByName("Base");pourquoi commencer ligne 11 alors que les données commencent ligne 12
var tableau = Base.getRange('A12:N' + lastRow).getValues()pourquoi retrancher 10 et 9 ce qui supprime dans un cas le bas du tableau et dans l'autre à ne rien retenir
for (i = 0; i < tableau.length ; i++) {
for (a = 0; a < param.length ; a++) {reste ensuite l'erreur du substring puisque les données sont numériques une fois sur 2, et pourquoi 8 si tu ne retiens que 7 caractères pour la comparaison, il faut donc passer en texte et écrire
if (param[a][0].toString().substring(0, 7) == tableau[i][0].toString())d'où une première correction qui conduit en effet à détecter des valeurs identiques
function IMPORT() {
var ficheVERIF = SpreadsheetApp.getActiveSpreadsheet();
var feuilleVERIF = ficheVERIF.getSheetByName("CR-MR");
var init = feuilleVERIF.getRange('D10:E').clearContent();
// se place sur la feuille 'Base' du fichier ETAL
var Base = ficheVERIF.getSheetByName("Base");
//recherche des coeff A et B
var lastRow = Base.getLastRow();
var tableau = Base.getRange('A12:N' + lastRow).getValues();
var result = []
var lastRow2 = feuilleVERIF.getLastRow();
var param = feuilleVERIF.getRange('A10:N' + lastRow2).getValues();
//importation coeff A et coeffB
for (i = 0; i < tableau.length ; i++) {
for (a = 0; a < param.length ; a++) {
if (param[a][0].toString().substring(0, 7) == tableau[i][0].toString()) { //vérifie si les paramètres sont les même
Logger.log('ok')
if (tableau[i + 1][0] !== '' && tableau[i + 2][0] !== '' && tableau[i + 3][0] !== '') {
//passer à la ligne suivante non vide
}
else if (tableau[i][7] !== '' && tableau[i][8] !== '') {
var coefA = tableau[i][7].substring(0);
var coefB = tableau[i][8].substring(0);
}
else if (tableau[i][9] !== '' && tableau[i][10] !== '') {
var coefA = tableau[i][9].substring(0);
var coefB = tableau[i][10].substring(0);
}
else if (tableau[i][11] !== '' && tableau[i][12] !== '') {
var coefA = tableau[i][11].substring(0);
var coefB = tableau[i][12].substring(0);
}
}
else {
var coefA = 'NO RESULT'
var coefB = 'NO RESULT'
}
result.push([[coefA], [coefB]]);
}
}
var verif_ETAL = feuilleVERIF.getRange(10, 4, result.length, result[0].length).setValues(result);
}je continuerai la suite dans la journée
Pour ce qui est maintenant du sujet à proprement parler,
La petite subtilité est que certains paramètres sont sur 3 ou 4 lignes, donc quand la ligne n+1 et n+2 et n+3 sont vides (car correspondent au même paramètre en n-x), il passe au paramètre suivant sans prendre en compte les lignes vides.. donc il passe à la ligne non vide.
ajoute une variable aComparer qui conservera sa valeur si la donnée de la colonne A est vide (à la suite de la fusion)
for (i = 0; i < tableau.length; i++) {
for (a = 0; a < param.length; a++) {
aComparer = tableau[i][0] == '' ? aComparer : tableau[i][0]
if (param[a][0].toString().substring(0, 7) == aComparer.toString()) { dernier problème quand même ...
result.push([[coefA], [coefB]]);poussera autant de valeurs que de comparaison donc bien plus que de lignes de la feuille CR-MR, je te laisse régler ce point.
D'accord,
Mon fichier est en réalité plus complet que le fichier simplifié donc les petites questions du début sont dues au fait que le fichier est différent :) (nombre de lignes différent par exemple)
Merci pour cette réponse! Je n'ai pas bien compris cette histoire de variable aComparer.. en réalité je veux juste que les cellules fusionnées ne soient pas pris en compte.
Mon fichier est en réalité plus complet que le fichier simplifié donc les petites questions du début sont dues au fait que le fichier est différent :) (nombre de lignes différent par exemple)
ok, mais il ne sert à rien de diminuer la valeur maxi de la boucle car tu as défini param et tableau à partir de la ligne utile.
Bonjour,
Pour en revenir à ce sujet, j'ai essayé plusieurs choses et je suis vraiment bloquée.
J'ai importé un cas concret dans la feuille simplifiée. C'est au niveau des multi-coefficients que ca bloque. Comment faire pour importer de l'onglet BASE jusqu'à l'onglet CR-MR les coefficients pour un meme paramètre, en sachant que dans l'onglet CR-MR le paramètre apparaît en plusieurs fois (avec ses multi-coefficients)
et dans l'onglet Base il apparait en tant que cellule mergée:
Comment faire correspondre ces coefficients? Avez-vous une idée?
Merci beaucoup d'avance,
Ce n'est pas le même sujet que celui-ci ? https://forum.excel-pratique.com/sheets/google-sheet-boucle-for-et-boucle-if-169966/2#p1059690
Pourquoi y a t il ces cellules fusionnées, est-ce le résultat d'un autre script ? De où viennent ces informations ?
Quel est l'onglet source et l'onglet résultat attendu ?
Cette fiche simplifiée est en réalité la suite du projet.
https://docs.google.com/spreadsheets/d/12zxuXmYpC8EGjKxiYH_LIqLQlEgPAZjNxwokvFTU294/edit?usp=sharing
Les cellules fusionnées viennent d'un autre fichier dont il faut récupérer les coefficients et les comparer à ceux déjà renseignés dans l'onglet CR-MR.
L'onglet "source" est donc dans le fichier simplifiée l'onglet "Base" dont il faut (comme pour le sujet précédent) récupérer les coefficients et l'implémenter dans l'onglet CR-MR pour pouvoir PAR LA SUITE les comparer avec les coefficients déjà rentrés.
Je suis désolé, mais je ne travaille pas avec des cellule fusionnées. Voir mon commentaire ici
https://forum.excel-pratique.com/sheets/google-sheet-boucle-for-et-boucle-if-169966/2#p1060698
Cela entraîne une complexité inutile. Ce n'est pas un bon mode de gestion, on ne peut ensuite rien tirer directement sinon à faire des pirouettes. Il y a des solutoins de présentations dissociée des calculs si besoin (MFC, TCD).
D'accord, je comprend!
Dans le cas où j'ai dé-fusionné mes cellules, est-ce que je peux en tirer quelque chose? (soit je laisse vide les cellules en dessous, soit je les rempli avec le même paramètre). J'aimerais comparer les coefficients pour les même paramètres:
https://docs.google.com/spreadsheets/d/12zxuXmYpC8EGjKxiYH_LIqLQlEgPAZjNxwokvFTU294/edit?usp=sharing
for (i=0; i < tableau.length ; i++){
for (a=0; a < param.length ; a++){
if (param[a][0].toString().substring(0,7) == tableau[i][0].toString()){ //vérifie si les paramètres sont les même
Logger.log('ok')
if (tableau[i][6] !== '' && tableau[i][7] !== ''){
var coefA = tableau[i][6];
var coefB = tableau[i][7];
result.push([[coefA], [coefB]]);
}
else if (tableau[i][8] !== '' && tableau[i][9] !== ''){
var coefA = tableau[i][8];
var coefB = tableau[i][9];
result.push([[coefA], [coefB]]);
}
else if (tableau[i][10] !== '' && tableau[i][11] !== ''){
var coefA = tableau[i][10];
var coefB = tableau[i][11];
result.push([[coefA], [coefB]]);
}
var reglage = tableau[i][6];
var unite = tableau[i][13];
var cadence = tableau[i]['CA'];
var titre = tableau[i]['BC'];
}
else {
var coefA = 'NOT FOUND'
var coefB = 'NOT FOUND'
}
}
}
var verif_ETAL = feuilleVERIF.getRange(10,5,result.length,result[0].length).setValues(result);
}Fusionnées ou défusionnées, c'est pareil, les lignes ne sont pas "autosuffisantes" et il est toujours plus compliquée d'aller chercher une information sur une autre ligne. Pour moi, pour travailler correctement, il faut que les lignes contiennent les informations dépendent de la la ligne.
Il y a des méthodes pour alléger éventuellement la lecture, soit par MFC soit par TCD
Ceci est tout à fait applicable à GSheets https://www.xlerateur.com/divers/2010/05/14/les-13-regles-d%E2%80%99or-pour-utiliser-excel-comme-ges...
Oui, je comprend bien mais dans mon cas j'ai dé-fusionné et maintenant chaque ligne dépend d'une info (chaque coefficient dépend d'un paramètre)
https://docs.google.com/spreadsheets/d/12zxuXmYpC8EGjKxiYH_LIqLQlEgPAZjNxwokvFTU294/edit?usp=sharing
Je pourrais rajouter une MFC par la suite
ok je vais regarder
Quand il y a des lignes multiples, comment veux-tu les représenter en face des autres ?
Comment distinguer 50112320 et 5011232F puisque dans la feuille base il y a la même racine 5011232 ?
bon, je dépouille, je dépouille ..
j'ai rencontré une autre difficulté qui est que les données sont textuelles et non numériques !!
il va falloir passer la feuille en paramètres Etats-Unis par exemple
J'en suis là pour l'instant. J'ai regroupé les données des 2 onglets par formule pour le moment (on peut le faire en script).
La feuille est au format US.
Je n'ai rien pris des colonnes I et J dans les formules puisqu'il n'y a aucune donnée.
En B1
=arrayformula(sort({
query({(left(to_text('CR-MR'!$A10:$A),7)) , 'CR-MR'!B10:B * 1 },"SELECT Col1,Col2,' ' where Col1 is not null label ' ' '' ",0);
query({(left(to_text(Base!$A12:$A),7)) , if(Base!G12:G="","",Base!G12:G * 1) },"SELECT Col1,' ',Col2 where Col2 is not null label ' ' '' ",0);
query({(left(to_text(Base!$A12:$A),7)) , if(Base!K12:K="","",Base!K12:K * 1) },"SELECT Col1,' ',Col2 where Col2 is not null label ' ' '' ",0)
}))en B5
=arrayformula(sort({
query({(left(to_text('CR-MR'!$A10:$A),7)) , 'CR-MR'!C10:C * 1 },"SELECT Col1,Col2,' ' where Col1 is not null label ' ' '' ",0);
query({(left(to_text(Base!$A12:$A),7)) , if(Base!H12:H="","",Base!H12:H * 1) },"SELECT Col1,' ',Col2 where Col2 is not null label ' ' '' ",0);
query({(left(to_text(Base!$A12:$A),7)) , if(Base!L12:L="","",Base!L12:L * 1) },"SELECT Col1,' ',Col2 where Col2 is not null label ' ' '' ",0)
}))Pas beaucoup de choses à comparer in fine
Tout dépend de la comparaison que tu veux faire ... moyenne, mini/max, écarts ?
https://docs.google.com/spreadsheets/d/1-25sMfW1OlveU7UBdLXdoo-9nhqMSpYJBLC9ets6EJo/copy
