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++)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é ?
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");"\+ (.*) \(")))
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:
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 !