Récupérer la valeur d'une cellule&copier la valeur dans une autre AppScript

Bonjour,

Je suis débutant et je cherche la solution au problème, récupérer la valeur d'une cellule et copier la valeur dans une autre, comme indiqué dans le titre.

La subtilitée ici est que je dois retrouver la cellule à modifier (une adresse à actualiser) sur une autre feuille que la feuille où se fait la saisie, et je dois retrouver cette cellule par rapport au n° de série de mon dispositif.

Pour clarifier ce que je cherche à faire, mes dispositifs vont être déplacés à plusieurs adresses postales, je souhaite garder l'historique ( ce qui est fait grâce à https://forum.excel-pratique.com/sheets/creer-un-historique-automatise-a-chaque-nouvelle-saisie-1805... ), mais je souhaite aussi que les adresses dans ma page de base de données s'actualisent après l'utilisation du script quand j'en renseigne une nouvelle.

capture1

Dans le cas ci-dessus (Page: Saisie), je souhaite que le 'n°1' prenne la nouvelle adresse après que le script ait historisé le temps passé à l'adresse: 1 rue de l'exemple

Autrement dit je souhaite qu'une recherche se fasse dans la colonne B ci-dessous (Page: BDD saisie)

afin d'avoir la ligne correspondante à ma donnée à modifier (je ne peux pas me baser sur l'adresse, risque de doublons)

puis de modifier la colonne D ( dans l'exemple je souhaite donc avoir : 10 rue de l'exemple dans la cellule D2 )

capture 2

Je met ci-dessous le code me servant à l'historisation :

function saisir(){ 

  var doc = SpreadsheetApp.getActiveSpreadsheet(); 
  // Elle commence par récupérer l'objet de la feuille active en utilisant SpreadsheetApp.getActiveSpreadsheet() et stocke également une référence à la feuille active.
  var f1 = SpreadsheetApp.getActive();
  var test = f1.getRange('H3').getValue();
  //Elle obtient la valeur de la cellule H3 dans la feuille active en utilisant f1.getRange('H3').getValue(), et la stocke dans la variable test.
  if (test == 'ok') {
    var data = f1.getRange('C4:G18').getValues()
    //Si test = ok, elle récupère les données de la plage de cellules C4:G18 dans la feuille active et les stocke dans la variable data.
    var result = []
    //Ensuite, elle initialise un tableau vide result pour stocker les résultats du traitement ultérieur.
    var f2 = doc.getSheetByName('saisie log');
    //Elle récupère une référence à une feuille spécifique dans le même classeur Google Sheets en utilisant doc.getSheetByName('saisie log').
    for (var ligne = 4; ligne <= 14; ligne=ligne+2){
      //En utilisant une boucle for, elle parcourt les lignes de 6 à 14 avec un pas de 2 (ligne par ligne).
      if(data[ligne][0]!=''){
        //Pour chaque ligne, si la première colonne n'est pas vide, elle extrait certaines valeurs de la matrice data et les stocke dans le tableau result.
        result.push([data[0][0],data[ligne][0],data[ligne][2],data[ligne][4]])      
        //data[x][y] représente une cellule dans la plage spécifiée C4:G18, où x correspond au numéro de ligne et y correspond au numéro de colonne. 
        //data[ligne][0] fait référence à la cellule située à la ligne 'ligne' et à la première colonne de la plage 'C4:G18'. La variable 'ligne' est une variable itérative dans la boucle 'for', donc elle prendra successivement les valeurs de [4] à [14] avec un pas de 2.
      }
    }
    var f2 = doc.getSheetByName('saisie log')
    var der = getLastDataRow(f2,"A")
    //Enfin, elle utilise getLastDataRow() pour obtenir le numéro de la dernière ligne utilisée dans la feuille 'saisie log', puis écrit les données stockées dans result à partir de cette ligne dans la feuille 'saisie log'.
    f2.getRange(der+1,1,result.length,4).setValues(result)
    f1.getRange('C8:C18').clearContent()
    f1.getRange('G8:G18').clearContent()
    f1.getRange('I8:I18').clearContent()
    //Enfin, elle efface le contenu de certaines plages de cellules dans la feuille active.
  } else {
    Browser.msgBox('Merci de renseigner tous les champs !');
    f1.setActiveSelection(origine[0]);
  }
}

function getLastDataRow(sheet,col) {
// Cette fonction prend deux arguments : sheet (la feuille de calcul) et col (la lettre de la colonne).
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  //Elle récupère le numéro de la dernière ligne utilisée dans la colonne spécifiée de la feuille spécifiée.
  if (range.getValue() !== "") {
    return lastRow;
    //Si la dernière cellule de la colonne n'est pas vide, elle renvoie simplement le numéro de la dernière ligne.
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
    //Sinon, elle utilise getNextDataCell(SpreadsheetApp.Direction.UP) pour remonter jusqu'à la dernière cellule non vide dans cette colonne, puis renvoie le numéro de ligne de cette cellule.
  }              
}

(Désolé pour les commentaires de ChatGPT, je suis vraiment un débutant )

Voici le lien de mon fichier exemple : https://docs.google.com/spreadsheets/d/1QRZ3Ar8yW7OeDiwoWEA4GESI920coSRbgksCeUOuSQU/edit?usp=sharing

Merci d'avance, cordialement.

le script partagé est illisible.

Pour faire ce que tu demandes : (les plages, cellules sont sans doute à adapter)

function actualiseAdresse() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const saisieSheet = ss.getSheetByName('Saisie'); // nom de la feuille saisie
  const BDDSheet = ss.getSheetByName('BDD saisie'); // nom de la feuille BDD

  let ref = saisieSheet.getRange('C8').getValue(); // ta référence
  let newAdress = saisieSheet.getRange('I8').getValue(); // la nouvelle adresse
  let dataBDD = BDDSheet.getRange('A:E').getValues(); // plage de la BDD
  for(i=0;i<dataBDD.length;i++){
    if(ref===dataBDD[0]){
       BDDSheet.getRange(i+2,4).setValue(newAdress); // pas certain de cette ligne, il faut voir si la donnée est bien insérée dans la bonne cellule, sinon modifier la range.
    }
  }
}

Bonjour,

Merci pour la réponse, en testant avec le code joint ça n'actualise pas l'adresse, d'ailleurs au niveau de la référence prise en 'C8' et nouvelle adresse en 'I8' il faudrait que le fonctionnement reprenne l'idée de la première boucle for afin de lire si il y a des données en C10, C12, C14, C16 et C18, je met à nouveau le code ci-dessous (lisible normalement ) et je vais essayer de mon côté de faire des modifications pour le faire fonctionner.

Je me demande aussi pour utiliser la fonction un simple ajout d'une ligne "actualiseAdresse()" suffit pour la lancer?

function saisir(){ 
  var doc = SpreadsheetApp.getActiveSpreadsheet(); 
  var f1 = SpreadsheetApp.getActive();
  var test = f1.getRange('H3').getValue();
  if (test == 'ok') {
    var data = f1.getRange('C4:G18').getValues()
    var result = []
    var f2 = doc.getSheetByName('saisie log');
    for (var ligne = 4; ligne <= 14; ligne=ligne+2){
      if(data[ligne][0]!=''){
        result.push([data[0][0],data[ligne][0],data[ligne][2],data[ligne][4]])      
      }
    }
    var f2 = doc.getSheetByName('saisie log')
    var der = getLastDataRow(f2,"A")
    f2.getRange(der+1,1,result.length,4).setValues(result)
    actualiseAdresse() // nouvelle fonction
    f1.getRange('C8:C18').clearContent()
    f1.getRange('G8:G18').clearContent()
    f1.getRange('I8:I18').clearContent()
  } else {
    Browser.msgBox('Merci de renseigner tous les champs !');
    f1.setActiveSelection(origine[0]);
  }
}

function getLastDataRow(sheet,col) {
  var lastRow = sheet.getLastRow();
  var range = sheet.getRange(col + lastRow);
  if (range.getValue() !== "") {
    return lastRow;
  } else {
    return range.getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  }              
}

// nouvelle fonction
function actualiseAdresse() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const saisieSheet = ss.getSheetByName('Saisie');
  const BDDSheet = ss.getSheetByName('BDD saisie');

  let ref = saisieSheet.getRange('C8').getValue();
  let newAdress = saisieSheet.getRange('I8').getValue();
  let dataBDD = BDDSheet.getRange('A:E').getValues();
  for(i=0;i<dataBDD.length;i++){
    if(ref===dataBDD[0]){
       BDDSheet.getRange(i+2,4).setValue(newAdress);
    }
  }
}

Bonjour,

en testant avec le code joint ça n'actualise pas l'adresse

C'est embêtant, est-il possible de partager le fichier accessible je fasse du debug ?

Ensuite pour les nouvelles données, si je comprends bien il n'y a pas que C8 et I8 mais tout un tableau avec plusieurs nouvelles données ? Si c'est le cas, il est possible de faire une boucle avec 2 fonction :

function nouvellesAdresses() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const saisieSheet = ss.getSheetByName('Saisie'); // nom de la feuille saisie
  let data = saisieSheet.getRange('C8:I').getValues();
  data.forEach(row => {
    actualiseAdresse(row[0], row[3]);
  });
}

function actualiseAdresse(ref, newAdress) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const BDDSheet = ss.getSheetByName('BDD saisie'); // nom de la feuille BDD
  let dataBDD = BDDSheet.getRange('A:E').getValues(); // plage de la BDD
  for (i=0;i<dataBDD.length; i++) {
    if (ref === dataBDD[i][0]) {
      BDDSheet.getRange(i + 2, 4).setValue(newAdress);
    }
  }
}

Je ne peux pas mettre de lien en réponse car il faut avoir posté au moins 30 messages sur le forum ... mais tout en bas mon premier message il y a le lien de mon google sheets ouvert à tous, normalement en faisant : Extension -> AppScript vous pouvez y accéder.

Oui, pour les données il peut y avoir entre 1 et 6 lignes (C8,C10...C18) à ajouter dans l'historique en simultané, donc entre 1 et 6 lignes avec une adresse à modifier.

C'est pour cela que dans le code pour l'historisation il y a : var data = f1.getRange('C4:G18').getValues() puis ensuite la fonction For pour lire les lignes correspondantes.

Ok, j'ai testé sur ton fichier, voici un script fonctionnel :

function nouvellesAdresses() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const saisieSheet = ss.getSheetByName('Saisie'); // nom de la feuille saisie
  let data = saisieSheet.getRange(8,3,saisieSheet.getLastRow(),7).getValues();
  data = data.filter(row => row.some(cell => cell !== ''));
  data.forEach(row => {
    actualiseAdresse(row[0], row[6]);
  });}

function actualiseAdresse(ref, newAdress) {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const BDDSheet = ss.getSheetByName('BDD saisie'); // nom de la feuille BDD
  let dataBDD = BDDSheet.getRange(2,2,BDDSheet.getLastRow(),6).getValues(); // plage de la BDD
  for (i=0;i<dataBDD.length; i++) {
    if (ref === dataBDD[i][0]) {
      BDDSheet.getRange(i + 2, 4).setValue(newAdress);
    }}}

Merci beaucoup et bonne journée!

Rechercher des sujets similaires à "recuperer valeur copier appscript"