Google sheet, Boucle for et boucle if

Bonjour,

J'ai un tableau avec à l'intérieur de chaque cellule de la première colonne des chaînes de caractère. Je cherche à ne garder seulement que les cellules qui commencent par " ' " suivi de "50" ou "51" (exemple: '5019873 ) pour, par la suite lui affecter une valeur contenu dans la cellule (i+1, b+1).

J'ai effectué le code suivant (un début) avec plusieurs boucles, j'obtiens un message d'erreur: "Cell reference out of range". Quelqu'un aurait-il une idée?

Merci beaucoup d'avance,

//filtrer les mesures

var lastRow = feuilleCALIB.getLastRow();

 var firstColumn = feuilleCALIB.getRange('A3:A'+lastRow); 

 //console.log(firstColumn.getValues()); 

 for (i=0; i<=lastRow; i++){ 

   var param = firstColumn.getCell(i,1).getValue(); 

    var g = "";  

    g = param.substring(0,1); 

    console.log(g.getValue()) 

    if(g == "'"){ 

        ATA = param.substring(1,2) 

        //if (ATA = "50") or if(ATA = "51"){

Bonjour,

i ne peut pas commencer à 0 ici car tu l'utilises ensuite dans une range et non un array

for (i=0; i<=lastRow; i++)

Quelle est la différence dans ce cas?

les ranges commencent à 1, donc essaie

for (i=1; i<=lastRow; i++)

Bonjour,

D'accord merci, en ce qui concerne la récupération de toutes les chaînes d'une colonne qui commencent par '50 ou '51 , est-ce que le code comporte des incohérences?

Il me semble que le console.log(g.getValue) ne marche pas..

J'aimerais juste qu'il garde en premier lieux les cases qui commencent par ' puis par 50 ou 51.

g.getValue ou g.getValue() ?

de toute façon, dans ton code g qui est un string ne comporte pas de donnée ! (g="")

var param = firstColumn.getCell(i,1).getValue(); 
var g = "";  
g = param.substring(0,1); 
console.log(g.getValue())

peux-tu mettre un lien vers un fichier simplifié ?

104classeur2.xlsx (10.00 Ko)

Prenons le classeur précédent, je cherche à affecter pour chaque ligne la valeur A,B,C etc pour chaque parametre qui est en colonne n-1 et ligne i-1, mais dans un premier temps je ne veux garder qu'un certain nombre de paramètres (ceux qui commencent par '01 dans le fichier simplifié) donc je boucle pour chaque ligne puis ne garde que les chaines de caractère commençant par ' PUIS les chaines qui poursuivent par 01..

Je ne sais pas si c'est clair

si c'est du google sheet, merci de mettre le lien vers un fichier simplifié https://www.sheets-pratique.com/fr/cours/partage

les codes VBA et GAS n'ont rien en commun !

Je comprend bien mais il est impossible pour moi de partager le sheet en entier.. j'ai quand meme inséré une partie du code en dessous

Pensez-vous pouvoir y jeter un oeil?

function Import_Coeff() {

  // se place sur la feuille Calibration

  var feuilleCALIB = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  //filtrer les mesures 50, 51
  var lastRow = feuilleCALIB.getLastRow();
  var firstColumn = feuilleCALIB.getRange('A3:A'+lastRow);
  var tableau = feuilleCALIB.getRange('A:B');
  console.log(tableau.getValues());

  for (i=1; i<=lastRow; i++){
    var param = firstColumn.getCell(i,1).getValue();
    var g = param.toString();
    e = g.substring(0,1);

    //console.log(e.getValue());

    if(g == "'"){
      ATA = param.substring(1,2);
      //if (ATA = "50") and if(ATA = "51") and if (ATA= "52"){

      //}

          //prendre les coeff A
          //ligneCoeff = 
    }
  }

Je comprend bien mais il est impossible pour moi de partager le sheet en entier..

je comprends aussi mais il est toujours possible de faire un fichier simplifié

pourquoi c'est important ? outre le fait que cela évite de recopier ou de se faire un fichier, cela permet de voir quels sont tes paramètres régionaux, les formats de cellules (texte, numérique) etc. (il y a d'autres raisons, ce n'est pas du tout un caprice de notre part quand on le demande)

je me suis débrouillé, et j'ai pas mal de remarques

1- si tu mets

var lastRow = feuilleCALIB.getLastRow();
var firstColumn = feuilleCALIB.getRange('A3:A'+lastRow);

alors le

for (i=1; i<=lastRow; i++)

dépassera la taille, il faut retrancher les 2 premières lignes que tu as ignorées dans ta firstColumn et écrire

for (i = 1; i <= lastRow - 2; i++) {

2- je ne suis pas sûr du tout que tu captes ce premier caractère ', seul le fichier me permettrait de le voir

if(g == "'"){

c'est souvent un caractère introduit pour forcer le passage de la valeur en texte, il se voit, mais ne se capte pas, donne le résultat de cette formule pour voir

en C3
=LEFT(A3;1)

3- question de logique, tu ne peux pas écrire

if (ATA = "50") and if(ATA = "51") and if (ATA= "52")

c'est impossible que ce soit à la fois 50, 51 et 52 ... avec un OU j'aurais compris !

Dans les tests, la comparaison se fait avec == ou ===, mais pas = qui affecte la valeur à une variable, et ET s'écrit && et OU s'écrt ||

Donc, tu peux mettre

    ATA = param.substring(0,2);
    if (ATA == "50" || ATA == "51" || ATA == "52") {

Ensuite, je ne sais pas ce que tu veux faire, je ne sais pas ce qu'il y a en colonne B

Ceci est "fonctionnel"

function Import_Coeff() {

  // se place sur la feuille Calibration

  var feuilleCALIB = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  //filtrer les mesures 50, 51
  var lastRow = feuilleCALIB.getLastRow();
  var firstColumn = feuilleCALIB.getRange('A3:A' + lastRow);
  var tableau = feuilleCALIB.getRange('A3:B' + lastRow);
  console.log(tableau.getValues());

  for (i = 1; i <= lastRow - 2; i++) {
    var param = firstColumn.getCell(i, 1).getValue();
    ATA = param.substring(0,2);
    if (ATA == "50" || ATA == "51" || ATA == "52") {
      Logger.log(ATA)
    }
  }
}

Bonjour,

j'ai fait un premier essai uniquement avec des formules dans un autre onglet

en A10 :     =arrayformula(iferror(regexextract(query(Calibration!A3:A;"where A is not null");"\d+")))
en B10 :     =arrayformula(iferror(REGEXEXTRACT(query(Calibration!B5:B;"where B is not null");"\): (.*) x")))
en C10 :     =arrayformula(iferror(REGEXEXTRACT(query(Calibration!B5:B;"where B is not null");"\+ (.*) \(")))
image

par script

function Import_Coeff() {
  var feuilleCALIB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calibration')
  var lastRow = feuilleCALIB.getLastRow()
  var tableau = feuilleCALIB.getRange('A3:B' + lastRow).getValues()
  var result = []
  for (i = 0; i < tableau.length - 2; i++) {
    if (tableau[i][0].substring(0, 2) == "50" || tableau[i][0].substring(0, 2) == "51" || tableau[i][0].substring(0, 2) == "52") {
      var ATA = tableau[i][0].split("-")[0]
      var coefA = tableau[i + 2][1].split("): ")[1].split(" x")[0]
      var coefB = tableau[i + 2][1].split("+ ")[1].split(" (")[0]
      result.push([[ATA], [coefA], [coefB]])
    }
  }
  var crcm = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CR-MR')
  crcm.getRange(10,1,Math.max(11,crcm.getLastRow()-9),result[0].length).clearContent()
  crcm.getRange(10,1,result.length,result[0].length).setValues(result)
}

Bonjour,

Merci beaucoup pour tous ces conseils!

J'ai encore un message d'erreur que je n'arrive pas à enlever "Cannot read property 'split' of undefined" , pourtant les caractères spéciaux apparaissent dans la bonne ligne et la bonne colonne..

y compris sur le fichier que tu as posté ?

je viens de ré-essayer et je n'ai pas d'erreur !

quelle est la ligne du script concernée ?

Bonjour,

Les problèmes précédents ont été résolu mais j'ai de nouveau une question concernant un ajout de fonctionnalité.

Les coefficients A et B sont bien à la suite des autres en fonction des paramètres grace à :

result.push([[ATA], [coeffA], [coeffB]])

Comment faire si on a plusieurs coefficients A et B pour un même paramètre?

J'aimerais par exemple que mon tableau ressemble à ceci:

image

J'ai quelque chose comme ça mais la fin n'est pas juste évidemment:

            var coeffA_1 = tableau[i+2][1].substring(tableau[i+2][1].split(",")[0].split("): (")[1])
            var coeffB_1 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[0].split(",")[1])

            var coeffA_2 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[1].split(",")[0])
            var coeffB_2 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[1].split(",")[1])

            var coeffA_3 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[2].split(",")[0])
            var coeffB_3 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[2].split(",")[1].split(")")[0])

            result.push([[ATA], [coeffA_1], [coeffB_1], [coeffA_2], [coeffB_2], [coeffA_3], [coeffB_3]])

Merci d'avance

Bonjour,

ajoute un tri sur le résultat avec ceci

  result = result.sort(function (a, b) {
    return a[0] - b[0];
  });
function Import_Coeff() {
  var feuilleCALIB = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Calibration');
  var lastRow = feuilleCALIB.getLastRow();
  var tableau = feuilleCALIB.getRange('A3:B' + lastRow).getValues();
  var result = [];
  for (i = 0; i < tableau.length - 2; i++) {
    if (tableau[i][0].substring(0, 2) == "50" || tableau[i][0].substring(0, 2) == "51" || tableau[i][0].substring(0, 2) == "52") {
      var ATA = tableau[i][0].split("-")[0];
      var coefA = tableau[i + 2][1].split("): ")[1].split(" x")[0];
      var coefB = tableau[i + 2][1].split("+ ")[1].split(" (")[0];
      result.push([[ATA], [coefA], [coefB]]);
    }
  }
  result = result.sort(function (a, b) {
    return a[0] - b[0];
  });
  var crcm = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('CR-MR');
  crcm.getRange(10, 1, Math.max(11, crcm.getLastRow() - 9), result[0].length).clearContent();
  crcm.getRange(10, 1, result.length, result[0].length).setValues(result);
}

et une MFC sur la colonne A10:A1000 avec

=and(A10<>"";A10=A9)

et couleur de police = blanche

Dans mon cas, comment cela est censé marcher car je n'ai plus 3 mais 7 arguments dans result (coeff2A, coeff2B, coeff3A etc...):

j'ai extrait les coefficients et j'aimerais que les coeff A et les coeff B soient en dessous les uns des autres.

 else if (tableau[i+2][1].includes("graphique")){
          if (tableau[i+2][1].includes(",") && tableau[i+2][1].includes(",") && tableau[i+2][1].includes(",")){

            var coeffA_1 = tableau[i+2][1].substring(tableau[i+2][1].split(",")[0].split("): (")[1])
            var coeffB_1 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[0].split(",")[1])

            var coeffA_2 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[1].split(",")[0])
            var coeffB_2 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[1].split(",")[1])

            var coeffA_3 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[2].split(",")[0])
            var coeffB_3 = tableau[i+2][1].substring(tableau[i+2][1].split(") (")[2].split(",")[1].split(")")[0])

            result.push([[ATA], [coeffA], [coeffB], [coeffA_2], [coeffB_2], [coeffA_3], [coeffB_3]])
            result = result.sort(function (a, b) { 
              return a[0] - b[0]; 
              result.sort()
            });

          }

je ne comprends pas pourquoi aller chercher 3 séries de coeff

            var coeffA_1 
            var coeffB_1 

            var coeffA_2 
            var coeffB_2 

            var coeffA_3 
            var coeffB_3 

dans le script que je propose, je les "empile" automatiquement comme souhaité dans l'image que tu as postée !

Rechercher des sujets similaires à "google sheet boucle"