Script de saisie de bdd

En effet je n'avais pas fait attention que tu avais supprimé dans la feuille de saisie les lignes avec les titres.

Comme je les avais conservé dans mon fichier final, ca créait des décalages.

J'ai donc résolu le problème de doublon.

Ta copie en bloc permet de gagner du temps sur le script. Il faut donc que je la conserve.

Je comprends mieux ton script et je vais regarder si en découpant ton scprit par colonne je perds à nouveau du temps. Sinon je vais donc arranger mon tableau pour que les données se collent des colonnes A à F et non pas colonne A puis D puis N puis F, etc comme je le voulais initialement. Ca ne posera pas de problème.

Merci encore pour ton gros travail.

Afin que mon fichier soit pleinement opérationnel, j'ai besoin d'ajouter des infos sur d'autres colonnes à partir des données qui viennent d'être saisies

Dans le fichier partagé, j'ai par exemple ajouté la notion de semaine, mois et service via des formules

https://docs.google.com/spreadsheets/d/1eoR_eanPW_YZIgwHZMUPR88JlAUmhvy1dBfjSGZo2tI/edit#gid=7454029...

Le plus simple pour moi était donc de copier les formules sur l'intégralité des lignes, ainsi lorsque je lançais le scprit, les premières colonnes se mettaient à jour par rapport à la saisie et les autres colonnes par rapport aux formules.

Seuleument si j'inscrit des formules sur des lignes, le script actuel ne considère plius la ligne comme vierge et remplit la BDD en dessous.

exemple dans l'image si dessous, j'ai copié mes formules dans les cellules grisées. Logiquement le script ajoute des infos sur la ligne inférieure

image

Quel est le plus judicieux et comment faire?

- informer dans le script que la ligne à utliser est celle où il n'y a aucune info dans les 7 première colonnes?

- ajouter dans le script les formules pour toutes les colonnes qui suivent?

La première solution me parait plus simple à mettre en oeuvre mais elle m'oblige à copier d'avance mes formules sur des miliers de lignes. J'ai fait le test, ca n'alourdit en rien le fichier et la macro. La 2nde solution est surement plus fastidieuse à mettre en place mais elle a l'avantage de laisser une bdd propre et vierge tant que les données n'ont pas été saisies

Il y a peut-être encore une autre approche à laquelle je n'ai pas pensé.

Dans ce cas, la valeur der devient

var der = getLastDataRow(f2,"A")

et tu ajoutes la fonction

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

regarde les formules sur fond jaune ... arrayformula permet de propager la formule sur toute la colonne sans avoir à copier

elle est construite à partir de tes formules en indiquant juste A2:A au lieu de simplement A2

Mais oui c'est exactement ce dont j'avais besoin.

J'avais vu cette fonction mais jamais utilisé. Je n'y avais donc pas pensé.

Je souhaiterais ajouter la données de E21 de f1 en colonne Q de la feuille f2

Comme c'est une cellule qui n'est pas à la suite dans la feuille de saisie, on ne peut pas la déplacer en bloc. Mais je ne parviens pas à l'inscrire de façon unitaire

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');
    var HN = f1.getRange('E21').getValue();
    for (var ligne = 6; ligne <= 14; ligne=ligne+2){
      if(data[ligne][0]!=''){
        result.push([data[0][0],data[3][0],data[ligne][0],data[ligne][4],data[ligne][2],data[3][2],data[3][4]])
      }
    }
    var der = getLastDataRow(f2,"A")
    f2.getRange(der+1,1,result.length,7).setValues(result)
    f2.getRange('Q'+der).setValue(f1.getRange(HN).getValue())
    f1.getRange('C10:C18').clearContent()
    f1.getRange('G10:G18').clearContent()
    f1.getRange('C7').clearContent()
    f1.getRange('E21').clearContent()
    toast('données enregistrées"')
  } else {
    Browser.msgBox('Merci de renseigner tous les champs !');
    f1.setActiveSelection(origine[0]);
  }
}

J'ai ajouté une déclaration de la variable pour prendre la valeur

    var HN = f1.getRange('E21').getValue();

Mais pour saisir la donnée dans la feuille f2, je ne trouve pas.

f2.getRange('Q'+der).setValue(f1.getRange(HN).getValue())

ne fonctionne pas.

J'ai tenté de récupérer l'ancien script avec déclaration de DerL, etc mais je tombe toujours sur un message d'erreur lors du lancement du script

Il faudrait que je la colle sur une cellule fixe, ca irait mais comme je dois aller chercher la dernière ligne, au même titre que le bloc de cellules copiées, je ne trouve pas la solution

à tester ...

var HN = f1.getRange('E21').getValue();
f2.getRange('Q'+der).setValue(HN)

ou bien directement

f2.getRange('Q'+der).setValue(f1.getRange('E21').getValue())

remarque, l'usage veut que l'on emploie des minuscules, question de lisibilité avec les "objets" GAS google app script ... et même que l'on emploie l'écriture chameau ou plutôt dromadaire , ce que l'on appelle la camelCase https://fr.wikipedia.org/wiki/Camel_case

Las 2 fonctionnent. Mais ca m'affiche sur une ligne trop haut.

En effet la copie du bloc est en der+1 et la copie de HN est en der

f2.getRange(der+1,1,result.length,7).setValues(result)
f2.getRange('Q'+der).setValue(HN)

J'ai donc mis

f2.getRange('Q'+(der+1)).setValue(HN)

et ca fonctionne.

Merci pour tout

Rechercher des sujets similaires à "script saisie bdd"