BOUCLE FOR copier des données vers une autre page
Bonjour
encore une fois je fais appel a vous
en effet je tente d 'automatiser des commandes liée a mon stock de materiaux en rupture
pour cela j 'ai un tableau de donnée dont des case en rupture affiche une alerte ci-joint la capture d 'écran
de la je souhaite récupère et éditer une commande avec les informations inscrite ci dessus sur des cases spécifique ci dessous
pour cela j 'édite mon code script pour le moment simple avec ma version NOOB accompagner de
// le 1er code ma permis de confirmer la fonctionnement
j'ai par la suite décider de définir une répétition/boucle avec FOR
function valeurtableau(){
var TABLEAUSTOCK = SPREADSHEET.getSheetByName('renouvellement stock atelier')// FEUILLE RENOUVELLEMENT
var PAGECOMMANDE = SPREADSHEET.getSheetByName('COMMANDEATELIER); // feuille ATELIER
//const VALEURFOURNISSEUR = TABLEAUSTOCK.getRange('D10').getValue();
//console.log(VALEURFOURNISSEUR);
//const CODEPRODUIT = TABLEAUSTOCK.getRange('E10').getValue();
//console.log(CODEPRODUIT);
//const DESCRIPTIFPRODUIT=TABLEAUSTOCK.getRange('F10').getValue();
//console.log(DESCRIPTIFPRODUIT);
//const PRIXPRODUIT = TABLEAUSTOCK.getRange('G10').getValue();
//console.log(PRIXPRODUIT);
//const QUANTITEPRODUIT = TABLEAUSTOCK.getRange('H10').getValue();
// console.log(QUANTITEPRODUIT);
for (let i = 2;i <= 15; i++) {
//var fournisseur = TABLEAUFOURNISSEUR.getRange(i,4)
//console.log(fournisseur.getValue())
console.log("lancement de la fonction copiedonnee")
const donneeCommande = [(i,4),(i,5), (i,6),(i,7),(i,8)].map(cell => TABLEAUSTOCK.getRange(cell).getValue());
const donneesCopier = ['K8', 'C22', 'E22', 'J22', 'I22'];
donneesCopier.forEach((cell, index) => PAGECOMMANDE.getRange(cell).setValue(donneeCommande[index]));
console.timeEnd('test_dic');
}
}j 'ai forcement une erreur !!!
DONC je me dis peu être qu 'il n 'est pas possible de définir une cellule via des coordonné peu être que c 'est une erreur d 'écriture !!
bref comme d 'habitude je sèche un peu la ca doit être une connerie
alors MERCI PAR AVANCE DE VOTRE INTERET ET DE VOTRE REPONSE JUSTE si vous pouviez par me faire tous le code en mode solution ca serait sympa
je dois encore bosser par la suite sur ce code en effet il y a plusieurs autre problème que je vais devoir résoudre avec mes notions
Salut,
C'est peu compréhensible vu de l'extérieur, voici un tuto sur les boucles :
OK merci pierre je comprend
mais si je te donne tous le code je commence a te connaitre tu va tous me pondre !!! c 'est sympa mais faut que je progresse aussi
bon a force de manipulation je viens de découvrir une nouvelle chose
le système de coordonné de cellule par ( ligne et colonne) ne permet pas d 'incrémenter
par contre avec le système de cellule type 'D1' peu s 'incrementer ca me donne ca et c 'est une reussite
function valeurtableau(){
const SPREADSHEET = SpreadsheetApp.getActiveSpreadsheet()
console.time('test');
var TABLEAUSTOCK = SPREADSHEET.getSheetByName('renouvellement stock atelier')// FEUILLE RENOUVELLEMENT
var PAGECOMMANDE = SPREADSHEET.getSheetByName('COMMANDE IMPRESSION'); // feuille ATELIER
for (let i = 0;i <= 15; i++) {
console.log("lancement de la fonction copiedonnee")
const donneeCommande = ['D1'+i,'E1'+i ,'F1'+i,'G1'+1,'H1'+i].map(cell => TABLEAUSTOCK.getRange(cell).getValue());
const donneesCopier = ['K8', 'C22', 'E22', 'J22', 'I22'];
donneesCopier.forEach((cell, index) => PAGECOMMANDE.getRange(cell).setValue(donneeCommande[index]));
console.timeEnd('test')
}
}un SAGE ma conseillé de mettre de console log pour confirmer mes commandes
parce que pierre veux se mettre dedans !!
https://docs.google.com/spreadsheets/d/1dLvgmVLBovbPODqn4oX3aGJ-4fjc4yGDqmvG4FeUKKU/edit?usp=sharing
Allez prochaine étape
trouver la commande
mes lignes vides ne pas faire de copie si ligne est vide
le système de coordonné de cellule par ( ligne et colonne) ne permet pas d 'incrémenter
Si, de plusieurs manières, ou bien avec les noms de cellules :
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
const col = 'A'
for(i=1;i<=10;i++){
var cell = sheet.getRange(col+i).getValue()
console.log(cell)
}
}
Ce que donne cette boucle :
Mais personnellement je trouve cela peu fiable d'agir sur le numéro de ligne, je préfère utiliser getRange avec les numéros de lignes / colonnes, tu as 3 moyens courant d'utiliser getRange :
Une cellule : sheet.getRange('A1')
une adresse ligne / colonne : sheet.getRange(1,1)
une adresse ligne / colonne / nb ligne / nb colonne : sheet.getRange(1,1,1,1)
Donc, si je reprends ma fonction, je peux itérer de cette manière :
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
for(i=1;i<=10;i++){
var cell = sheet.getRange(i,1).getValue()
console.log(cell)
}
}Maintenant, tu veux vérifier qu'une donnée n'est pas vide avant de la traiter, tu peux imbriquer une condition if, je vais reprendre mon exemple, en ajouter des données colonne B :
Si je veux les données des colonnes A & B lorsqu'il y a une donnée en B, je peux faire ainsi :
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataFiltre = [];
for(i=1;i<=10;i++){
var cell = sheet.getRange(i,1,1,2).getValues().flat();
if(cell[1]!==""){
dataFiltre.push(cell)
}
}
console.log(dataFiltre)
}Et voici le résultat de ma variable dataFiltre :
j 'était en train de faire le
IF
.... ++
j 'analyse ca c 'est le fait qu 'il y est rien dans la celluel qu ej dois rejeter faut que j 'arrive a exprimer a la commande
if ('D1'+i = "rien ")
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataFiltre = [ ];
for(i=1;i<=10;i++){
var cell = sheet.getRange(i,1,1,2).getValues().flat();
if(cell[1]!==""){
dataFiltre.push(cell)
}
}
console.log(dataFiltre)
}Bonjour Zinc, Pierre,
@Zinc, un petit conseil puisque je vois que tu cherches à progresser. En "general", car il s'agit plus d'une convention, en programmation on note en MAJUSCULES les constants, ce qui permet de les identifier rapidement dans le code.
Tu as donc bien commence en définissant const SPREADSHEET…
Mais ensuite tu "casses" la convention en affectant des variables (var TABLEAUSTOCK etc), et ensuite tu affectes de nouvelles constants en minuscules ^^
C'est du detail et cela n'affecte en rien le fonctionnement du code, mais ça peut porter à confusion donc je te l'indique.
Dans la meme veine, tu peux te passer de "var" (vieux) au profit de "let" Var, Let, and Const – What's the Difference?. C'est plus moderne, et surtout cela respecte l'encapsulation.
Maintenant concernant ta question, avant de passer aux "formulations flèches" (certes très élégantes), je te conseille d'écrire dans un premier temps une boucle for standard (comme celle avec le "i"), en prenant le temps d'écrire et de vérifier les étapes intermédiaires. Quand ça marchera tu pourras simplifier en ForEach avec une flèche, mais c'est une formulation assez complexe et difficile à débuguer. Surtout quand on débute. Personnellement j'ai pas assez de mal à les utiliser car elles ne sont pas dispo dans tous les languages de programmation, et donc je n'ai pas pris "l'habitude". Cependant c'est un outil parfaitement optionnel dont tu peux te passer pour le moment/dans un premier temps.
EDIT : je vois que ça a déjà été proposé durant ma rédaction ahah très bien
Concernant les conventions de nommage, personnellement, je mets en majuscule les constantes ayant une portée globale et en camelCase celles qui sont dans une porté donnée :
const SS = ...
const SHEET_1 = ...
function blabla (){
const data = ....
const cookieUser = ...
....
}Bon pour le moment je bloque sur le fait que ma boucle effectue quand même la copie des donné même si la cellule fournisseur est vide
ce qui est facheux !!!
function valeurtableau(){
const SPREADSHEET = SpreadsheetApp.getActiveSpreadsheet()
console.time('test');
const TABLEAUSTOCK = SPREADSHEET.getSheetByName('renouvellement stock atelier')// FEUILLE RENOUVELLEMENT
const PAGECOMMANDE = SPREADSHEET.getSheetByName('COMMANDE IMPRESSION'); // feuille ATELIER
for (let i = 0;i <= 15; i++) {
//je verifie la valeur de fournisseur
var fournisseur = TABLEAUSTOCK.getRange('D1'+i).getValue()
console.log("le fournisseur est"+ fournisseur)
if (fournisseur == ""){
console.log("lancement de la fonction copiedonnee")
const donneeCommande = ['D1'+i,'E1'+i ,'F1'+i,'G1'+i,'H1'+i].map(cell => TABLEAUSTOCK.getRange(cell).getValue());
const donneesCopier = ['K8', 'C22', 'E22', 'J22', 'I22'];
donneesCopier.forEach((cell, index) => PAGECOMMANDE.getRange(cell).setValue(donneeCommande[index]));
}
console.timeEnd('test')
}
}après je vais avoir encore un gros boulot sur le fait que je dois faire un "trie" de ma base de donnée
en effet je dois faire une commande chez fournisseur 02 mais pour plusieurs produit j 'ai modifié la base de donnée dans ce sens
ce qui va engendré le fait de récupéré les produitsdu fournisseur 02 pour les coller à la suite dans la commande
ATTENTION LA CA DEVIENT CHAUD
if (fournisseur == ""){Ne devrais tu pas mettre :
if (fournisseur !== ""){punaise mais ca marche mieux oui juste une " ! "
fait la différence
aller je vais m 'atteler au reste mais en toute franchise la je sais même pas vers quelle commande aller
merci
j 'ai pensé ( oui ca arrive )
faire une recherche de la colonne D et en extraite une unique valeurs de chaque fournisseur
ce qui devrait me donner une colonne comme ca
par la suite je peu sur mon code définir pour chaque ligne de la colonne précédente une commande
mais bon je sais pas trop je tatonne la ...
Bonjour,
Une manière de procéder en JS pour filtrer les valeurs uniques d’une liste en 1 étape est d’utiliser le combo reduce/Set.
Array.prototype.reduce() - JavaScript | MDN
Pour l’explication “simple” : reduce prend une liste de valeurs, et applique une fonction à chacune des valeurs.
Set c’est un objet particulier : une sorte de liste, qu’on appelle dictionnaire ou hashmap en programmation. Il a de nombreuses propriétés, mais l’une d’elle est qu’il ne peut contenir de doublons. C’est comme ça.
Donc en parcourant la liste initiale, et en ajoutant toutes les valeurs dans le Set (dictionnaire) en fait, les valeurs déjà présentes ne sont pas réajoutées, donc on filtre. C’est très pratique et performant.
Ci-après un mini exemple :
function exemple() {
let mylist = [1,2,3,4,5,1,1,7,5,3,4,5]
console.log(mylist.reduce((set, e) => set.add(e), new Set()))
}ok je regarde ca et j 'essaye d 'appliquer
nota j 'ai continuer ma réflexion si j 'arrive a extraire le nombre de fois de fournisseur 02, fournisseur 04, etc apparaisse alors je dois pouvoir faire un FOR avec mon copie coller correspondant au nombre de fois que 'il apparait
Salut, tu peux aussi récupérer tes fournisseurs de manière unique, puis, ajouter les autres données sous chaque fournisseur, en reprenant mon exemple :
Script :
function myFunction() {
const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var dataFiltre = {};
for (i=1;i<=10;i++) {
var cell = sheet.getRange(i, 1, 1, 2).getValues().flat();
var key = cell[0];
var value = cell[1];
if (value !== "") {
if (!dataFiltre[key]) {
dataFiltre[key] = [];
}
dataFiltre[key].push(value);
}
}
console.log(dataFiltre)
}Résultat :
Bonjour,
Une manière de procéder en JS pour filtrer les valeurs uniques d’une liste en 1 étape est d’utiliser le combo reduce/Set.
Une petite astuce en passant pour saboh12617 : tu peux simplement convertir ton array en Set pour filtrer les doublons, pas besoin de reduce
Pour reprendre ton exemple :
function exemple() {
const mylist = [1, 2, 3, 4, 5, 1, 1, 7, 5, 3, 4, 5];
console.log(new Set(mylist));
}Ou pour obtenir un array au lieu d'un Set :
function exemple() {
const mylist = [1, 2, 3, 4, 5, 1, 1, 7, 5, 3, 4, 5];
console.log([...new Set(mylist)]);
}Bonjour Sébastien, merci pour l’astuce, encore plus simple ! Je suis vraiment débutant en JS, il va falloir que je m’y mette plus sérieusement ça n’a pas l’air mal.
@Zinc, n’oublie pas de toujours te référer à la doc, on a de la chance avec Google/Microsoft il y a tout qui est documenté en ligne et accessible facilement !
En l’occurence, pour le getRange : https://developers.google.com/apps-script/reference/spreadsheet/sheet?hl=fr#getrangerow,-column,-numrows,-numcolumns
Les paramètres sont getRange(ligne, colonne, nb_lignes, nb_colonnes) les deux derniers étant optionnels.
Pour les crochets, c’est simplement la manière en JavaScript d’accéder aux éléments d’une “liste”. Entre parenthèses ce sont des arguments de fonctions que l’on met, c’est différent.



