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

image

de la je souhaite récupère et éditer une commande avec les informations inscrite ci dessus sur des cases spécifique ci dessous

image

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 !!!

image

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

Bon j 'ai fait le test

en version de cellule a cellule ca fonctionne bien

image

le problème c 'est que j 'ai plusieurs ligne dans la base de donné en rupture

Donc j 'ai tenter ma manipulation des coordonnée de la cellule -> (ligne et colonne )

Salut,

C'est peu compréhensible vu de l'extérieur, voici un tuto sur les boucles :

https://sheets-pratique.com/fr/apps-script/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)
  }
}
image

Ce que donne cette boucle :

image

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 :

image

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 :

image

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

image
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

image

ce qui devrait me donner une colonne comme ca

image

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

Set - 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 :

image

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 :

image

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)]);
}

en faite je comprend pas ca

image

et puis pourquoi ont place des var entre crochet et pas entre parenthèse aussi !!

je suis désoler ( vraiment je débute) mais y a un truc que je pige pas en principe si j 'applique la formule exemple

image

je devrais avoir la console qui m 'affiche

1,2,3,4,5,7 or j 'ai ca

image

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.

Rechercher des sujets similaires à "boucle copier donnees page"