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)

image

et dans l'onglet Base il apparait en tant que cellule mergée:

image

Comment faire correspondre ces coefficients? Avez-vous une idée?

image

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

D'accord, cela implique trop de contraintes?

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 ?

Pour 50112320 et 5011232F ils ont la même racine donc j'aimerais que les coefficients soient les même.

En ce qui concerne les lignes multiples, il faudrait juste une simple importation avec les coefficients les uns à la suite des autres

image

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

image

Tout dépend de la comparaison que tu veux faire ... moyenne, mini/max, écarts ?

https://docs.google.com/spreadsheets/d/1-25sMfW1OlveU7UBdLXdoo-9nhqMSpYJBLC9ets6EJo/copy

Rechercher des sujets similaires à "importer comparer coefficients"