Exporter données Google Sheet A vers Google Sheet B

Hello le Forum,

J'ai deux Google Sheet :

"A" me permet de créer de nouvelles lignes de données

https://docs.google.com/spreadsheets/d/1SmADAl3izGKVF3L8lVgbrPrG22f1CNDSnT7QczS1fww/edit?usp=sharing

"B" me sert de base de données de stockage et est réutilisé dans "A" pour consulter, modifier...les données

https://docs.google.com/spreadsheets/d/1M1SX5kwkS5OKBTjAeufitRG9Fqv6rKXNPuS4UiNlbeI/edit?usp=sharing

Je cherche à chaque nouvel enregistrement dans "A" à mettre à jour ma base de données en "B",

sans utiliser IMPORTRANGE en "B".

Pour ce faire, j'ai un script que j'ai tenté d'adapter, mais qui beug malheureusement.

Déjà, il a fallu contourner le problème d'autorisations lié à ".openById"....

Si l'un ou l'une d'entre-vous pouvait se pencher sur ces éléments qui me bloquent depuis 15 jours maintenant, cela serait génial.

Merci pour vos expertises,

Belle journée,

Bonjour,

Alors, copyTo ne fonctionne pas entre 2 feuilles de 2 fichiers différents ...

Il faut capter les valeurs avec getValues() et ensuite les enregistrer dans le second fichier avec .setValues(lesValeurs)

function exporterDansBdd() {

  var sss = SpreadsheetApp.openById("1SmADAl3izGKVF3L8lVgbrPrG22f1CNDSnT7QczS1fww");//src
  var ssh = sss.getSheetByName("Export");
  var tss = SpreadsheetApp.openById("1M1SX5kwkS5OKBTjAeufitRG9Fqv6rKXNPuS4UiNlbeI");//tgt
  var tsh = tss.getSheetByName("BDD_Recettes")
  var data = ssh.getDataRange().getValues()
  tsh.getRange(1,1,data.length,data[0].length).setValues(data)

}

Steelson,

Tout simplement génial ...

Tellement fort que je me demande si je ne peux pas améliorer grave mon fichier...Grâce à toi !

J'arrive à créer des nouvelles lignes ou appeler des lignes existantes dans mon Fichier "A" en fonction de ma Base de données stockée dans mon fichier "B".
Bien entendu, j'ai crée une clé unique que l'on retrouve dans mon fichier "A" en colA de Export (en colonne B de "Temp" pour l'exemple, mais normalement située en colA aussi).

(j'ai mis à jour les fichiers exemple)

Je passe par une feuille "Temp" avant d'enregistrer dans la feuille "Export".

En revanche, modifier des lignes existantes, en fonction de l'existence d'une clé unique... oups ! je passe par Array, mais je ne suis pas assez solide...

Aurais-tu une idée ?

J'abuse, mais ça me dépasse tellement et en même temps vraiment envie de comprendre et progresser.

Merci beaucoup en tout cas, c'est déjà un grand pas

En revanche, modifier des lignes existantes, en fonction de l'existence d'une clé unique... oups ! je passe par Array, mais je ne suis pas assez solide...

Aurais-tu une idée ?

J'abuse, mais ça me dépasse tellement et en même temps vraiment envie de comprendre et progresser.

une façon de faire ... mais il y en a d'autres

  • j'ai mis dans la feuille test, en colonne A une case à cocher, bien sûr tu peux en mettre plusieurs et plusieurs lignes
  • quand cette case sera cochée, la ligne de B à BZ sera recopiée dans le fichier B
  • il faut toutefois déclarer un déclencheur en cliquant que l'horloge à gauche dans l'éditeur de script et en affectant à la fonction modif un déclencheur basé sur la feuille de calcul lors d'une modification
image
function modif(event) {
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName() == 'test' && cellule.getColumn() == 1 && cellule.getValue() == true) {
    var tss = SpreadsheetApp.openById("1M1SX5kwkS5OKBTjAeufitRG9Fqv6rKXNPuS4UiNlbeI");//tgt
    var tsh = tss.getSheetByName("BDD_Recettes")
    var values = tsh.getRange('A:A').getValues().flat()
    ligne = values.indexOf(cellule.offset(0, 1).getValue()) + 1
    if (ligne > 0) {
      var data = feuille.getRange('B'+cellule.getRow()+':BZ'+cellule.getRow()).getValues()
      tsh.getRange(ligne, 1, data.length, data[0].length).setValues(data)
    }
    cellule.setValue(!cellule.getValue())
    SpreadsheetApp.getActive().toast('BDD mise à jour !')
  }
}

pour retrouver la ligne, je suis passé par une collecte de toutes les clés remises à plat avec flat() et je cherche par un indexof si je retrouve la clé qui se situe à droite de la case à cocher (offset)

Whaou....

Bravo Steelson, je décortique au fur et à mesure !

On part du postulat que la ligne 2 cellules B:BZ du fichier test est une constante provenant des résultats issus d'un masque de saisie.

Cette ligne sera donc alimentée en permanence en fonction des recherches, modifications et créations.

Je cherche à exploiter ton code pour ajouter deux actions supplémentaires :

La première, j'essaye d'ajouter un if false pour mettre à jour la bdd avec un nouvel enregistrement si la clé n'est pas trouvé avec indexof

la seconde, je préférerais éviter une saisie dans la feuille "test". Je sais déjà via une formule mettre la checkbox en true ou false en fonction de la saisie dans mon masque. La commande via event pourra donc continuer à se déclencher de la même manière. j'ai testé et ça fonctionne bien sauf que ma formule =SI(A3="ok";vrai; faux) est systématiquement effacée après la mise à jour ^^

Si tu peux m'aider à boucler ce serait top !

encore un grand merci

Je sais déjà via une formule mettre la checkbox en true ou false en fonction de la saisie dans mon masque. La commande via event pourra donc continuer à se déclencher de la même manière. j'ai testé et ça fonctionne bien

j'ai un doute, car normalement le event ne prend en compte que les actions manuelles directes sur la cellule concernée, si c'est le résultat d'une formule, rien ne devrait se passer ...

Ton projet est assez proche de celui-ci en fait https://forum.excel-pratique.com/sheets/recuperer-info-d-une-base-de-donnees-166828/2#p1033853

Il faudrait que je le re-visite et le simplifie pour qu'il soit plus facilement repris

La première, j'essaye d'ajouter un if false pour mettre à jour la bdd avec un nouvel enregistrement si la clé n'est pas trouvé avec indexof

la seconde, je préférerais éviter une saisie dans la feuille "test". Je sais déjà via une formule mettre la checkbox en true ou false en fonction de la saisie dans mon masque. La commande via event pourra donc continuer à se déclencher de la même manière. j'ai testé et ça fonctionne bien sauf que ma formule =SI(A3="ok";vrai; faux) est systématiquement effacée après la mise à jour ^^

proposition non testée

function modif(event) {
  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName() == 'test' && cellule.getColumn() == 1 && cellule.getValue() == true) {
    var tss = SpreadsheetApp.openById("1M1SX5kwkS5OKBTjAeufitRG9Fqv6rKXNPuS4UiNlbeI");//tgt
    var tsh = tss.getSheetByName("BDD_Recettes")
    var values = tsh.getRange('A:A').getValues().flat()
    ligne = values.indexOf(cellule.offset(0, 1).getValue()) + 1
    if (ligne = 0) {
      ligne = tsh.getLastRow()+1
    }
    var data = feuille.getRange('B'+cellule.getRow()+':BZ'+cellule.getRow()).getValues()
    tsh.getRange(ligne, 1, data.length, data[0].length).setValues(data)
    SpreadsheetApp.getActive().toast('BDD mise à jour !')
  }
}

si ligne = 0 cela veut dire que l'identifiant n'a pas été trouvé, donc on met la valeur de ligne à la première ligne vierge

Bonjour Steelson

Aille,

Quand l'ID n'est pas trouvé en colonne A dans la BDD

if (ligne = 0) {

ligne = tsh.getLastRow()+1 var data = feuille.getRange('B'+cellule.getRow()+':BZ'+cellule.getRow()).getValues()

tsh.getRange(ligne, 1, data.length, data[0].length).setValues(data)

Rien à faire, cela ne m'enregistre pas une nouvelle ligne dans la BDD !

Je bloque là je t'avoue :-)

Si jamais tu as une idée ...

Merci beaucoup

essaie de mettre le code dans la balise </> sinon on n'y voit pas clair

if (ligne = 0) {

ligne = tsh.getLastRow()+1 var data = feuille.getRange('B'+cellule.getRow()+':BZ'+cellule.getRow()).getValues()

tsh.getRange(ligne, 1, data.length, data[0].length).setValues(data)

Rien à faire, cela ne m'enregistre pas une nouvelle ligne dans la BDD !

ce n'est pas ce que j'avais proposé !

mais il manquait aussi == dans ma proposition

function modif2(event) {

  var feuille = event.source.getActiveSheet();
  var cellule = event.source.getActiveRange();
  if (feuille.getName() == 'test' && cellule.getColumn() == 1 && cellule.getValue() == true) {
    var tss = SpreadsheetApp.openById("1M1SX5kwkS5OKBTjAeufitRG9Fqv6rKXNPuS4UiNlbeI");//tgt
    var tsh = tss.getSheetByName("BDD_Recettes")
    var values = tsh.getRange('A:A').getValues().flat()
    ligne = values.indexOf(cellule.offset(0, 1).getValue()) + 1
    if (ligne == 0) {
      ligne = tsh.getLastRow() + 1
    }
    var data = feuille.getRange('B' + cellule.getRow() + ':BZ' + cellule.getRow()).getValues()
    tsh.getRange(ligne, 1, data.length, data[0].length).setValues(data)

    cellule.setValue(!cellule.getValue())
    SpreadsheetApp.getActive().toast('BDD mise à jour !')

  }
}

Bonjour Steelson,

ça fonctionne nickel maintenant, qu'il s'agisse de la création d'une nouvelle ligne ou d'une modification, avec répercussion dans la BDD.

En revanche, j'essaye d'adapter dans mon fichier ton code ouvert sur ce sujet :

https://forum.excel-pratique.com/sheets/recuperer-info-d-une-base-de-donnees-166828/2#p1033853

pour éviter de passer par un déclencheur et l'event.

J'ai la possibilité dans mon masque de saisie de déclarer une constante "en D8" feuille nommée "Fiche_Technique"

const nomFeuilleSaisie = 'Fiche_Technique'

const rangeID = 'D8'

const saisie = doc.getSheetByName(Fiche_Technique)

Et je tente de remplacer le if...avec la checkBox par cette constante if D8<>"" alors et reprendre la suite de ton code, mais je n'y parviens pas :-(

aurais-tu une idée ?

Merci à toi

Bonjour,

https://forum.excel-pratique.com/sheets/recuperer-info-d-une-base-de-donnees-166828/2#p1033853

pour éviter de passer par un déclencheur et l'event.

non, il passe aussi par un déclencheur, enfin oui et non, son intérêt réside dans le fait que lors de la saisie de l'identifiant les informations déjà présentes en BDD renseignent les champs

j'essaye d'adapter dans mon fichier ton code ouvert sur ce sujet :

https://forum.excel-pratique.com/sheets/recuperer-info-d-une-base-de-donnees-166828/2#p1033853

J'ai la possibilité dans mon masque de saisie de déclarer une constante "en D8" feuille nommée "Fiche_Technique"

as-tu une maquette de ta feuille de saisie

par ailleurs, il faut indiquer en ligne 1 de la base de données les cellules où se trouveront les informations dans la feuille de saisie (exemple si 'intitulé ...' se trouve en D12 de la feuille de saisie, il faut mettre D12 en tête de la colonne dans la BDD)

Steelson,

Je t'ai importé le masque de saisie dans le Fichier A.

Normalement toutes les plages sont nommées, là je l'ai fait pour quelques-unes seulement, ce qui explique que la plupart des formules sortent "" dans la feuille "Fiche_Technique".

(Les données proviennent de la BDD (fichier B) via un IMPORTRANGE)

Tous les affichages ou les saisies issues de "Fiche_Technique" sont répercutées sur la feuille "Test" qui sert à mettre à jour la BDD (corrections ou créations).

Dis moi si ça t'aide !

merci encore

ok sur le masque de saisie ... peut-être faudrait-il mieux mettre en évidence les zones à saisir en coloriant tout le reste d'une couleur "monotone"

il y a des décalages sur les zones nommées, mais ce n'est pas important pour moi

question : est-il utile de faire un importrange si le but est d'avoir la bdd dans un fichier séparé ?

Bonjour Steelson,

Pour les zones de saisies, je te rejoins. Selon qu'il s'agisse de création ou de consultation, les zones sont coloriées de façon différente sur la version originale avec des mises en formes conditionnelles.

Pour l'import de données, mes connaissances étant limitées, j'avais l'habitude de fonctionner ainsi et d'isoler la BDD dans un fichier à part pour conserver une base de données propre et utile à d'autres tableurs également.

On peut surement faire différemment mais avec mon niveau actuel, cela m'est difficile :-)

J'ai adapté mon code au fait d'avoir une base de données séparée

edit :

voir plus loin version finalisée

Steelson,

Oula, ça y est ! tu m'as perdu ¨¨

Bon, j'ai bien mis le masque tel quel pour fiche technique mais je ne parviens pas à comprendre ce que tu entends par encadré avec coeur, trèfle...????

J'ai également mis les coordonnées des cellules dans les entêtes de la BDD ?

Quand je lance il y a des bugs.

Arf, là je suis paumé complet :-)

Et j'oubliais, voici le bug :

ligne 57, il me précise : TypeError: Cannot read property 'getRange' of nullDétailsIgnorer

Merci à toi,

bel après-midi

Rechercher des sujets similaires à "exporter donnees google sheet"