Apps Script objets, classes et choix des colonnes cibles

gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 30/09/2023 à 02:12 Modifié par gaston


Bonjour,

J'ai trouvé ce [url=https://www.tutoderien.com/comment-creer-un-formulaire-de-saisie-dans-google-sheets-et-apps-script/
]super tuto[/url] qui m'a aidé à comprendre bien des choses sur les notions d'objet et de classe, afin de remplir ou modifier une base de données sur Sheets:

mais il y a quelque chose qui n'est pas prévu dans ce tuto et que je ne vois pas comment faire, c'est de pouvoir choisir les colonnes où seront placées les données: en effet, le script qui est expliqué place les données dans des colonnes contiguës, or, pour ma part, j'aimerais pouvoir avoir une colonne vide de temps en temps afin d'de pouvoir y calculer par exemple des soldes.
faire ça de manière "classique", c.a.d. sans objet ni classe, ça j'y arrive mais ce système de classe me paraît donner un code moins lourd , malheureusement, là je cale. À la rigueur, je peux créer des données bidon qui resteront tout le temps vides, mais je me demande s'il n'existerait pas un moyen plus "élégant" ?
Un petit coup de pouce serait le bienvenu

carpe diem

Répondre à ce message

Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 01/10/2023 à 17:57


Bonjour,
il faut se pencher sur la mention des offsets
par exemple
function newRange() {

// get spreadsheet
var ss = SpreadsheetApp.getActiveSheet();

// get range 'A1'
var cell = ss.getRange(1, 1).setValue('A1');

// new cell 'B2' from 'A1'
var newCell1 = cell.offset(1, 1).setValue('B2');

// new cell 'D3' from 'A1'
var newCell2 = cell.offset(2, 3).setValue('D3');

}

Ici on inscrit B2 et D3 en se référant à la variable Cell qui correspond à la cellule A1.
Pour plus de dynamisme, on peut remplacer les chiffres de l'offset par des variables qui s'incrémentent
Exemple:

function test(){
// get spreadsheet
var ss = SpreadsheetApp.getActiveSheet();

// get range 'A1'
var cell = ss.getRange(1, 1).setValue('Hello');

// new cell 'B2' from 'A1'
for (var x = 1; x <= 8; x = x + 2){
for (var y = 1; y <= 8; y = y + 1){
var newCell1 = cell.offset(x, y).setValue(cell.getValue());
}
}
}
Comme on fait x+2 on écrit une ligne sur 2
Note qu'il y a une fonction native petite vidéo en français c'est la fonction DECALER
exemple
=DECALER(C13;2;0) (note on peut y inclure le nom des feuilles
donc sur la feuille 2 tu peux avoir la formule
=DECALER('Feuille 1'!C13;2;1) qui donne le même résultat
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 03/10/2023 à 23:32


Bonjour,

Merci pour ta réponse, mais c'est un peu plus compliqué que cela:
en effet, dans le tuto en question, on crée un enregistrement avec appendRow.
Comme il est dit dans la doc, appendRow(rowcontent) ajoute une ligne en bas de la zone de données actuelle dans la feuille.
Les données seront mises dans cet ordre exactement, mais ce sera forcément 1 donnée par colonne contigüe

function createStudent(studentRecord){
studentPage.appendRow([
studentRecord.id,
studentRecord.firstName,
studentRecord.lastName,
studentRecord.birthday,
studentRecord.street,
studentRecord.postalCode,
studentRecord.city,
studentRecord.country,
new Date()
]);
setNextStudentId();
}



carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 04/10/2023 à 12:50 Modifié par Bipbipcoyote


Bonjour,
J'ai déjà fait cet exercice lien pour le récupérer je me suis même amusé à "franciser" les noms de fonctions et les variables
Effectivement, cela crée un objet avec les données qui composent un enregistrement, c'est donc un "tableau" créé dans la mémoire de l'ordi que l'on ajoute ou modifie - voir l'instruction push
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 04/10/2023 à 14:52 Modifié par gaston


Bonjour,

ouaip, j'ai également pu le reproduire, j'ai même trouvé 1 ou 2 erreurs dans le code, sur son site, que j'ai rectifiées.
Aha, je vois que tu as ajouté ce que j'avais pensé faire: des listes déroulantes dans le formulaire ! ^^ ...et que tu as amélioré pour le coup des doublons... (+)
Et c'est vrai que c'est bien, quand c'est en français ;-)
Je vais regarder comment tu as fait ça, merci pour le partage (+)

Mais donc, j'ai toujours ce problème des colonnes non contiguës, et également si je veux placer les données en commençant par une colonne autre que la numéro 1.
En attendant, j'ai contourné en mettant toutes mes données modifiables dans des colonnes contigües, et les autres (notamment des calculs de soldes) à la fin. Du fait que c'est plus difficile à lire, ensuite, je fais des query dans d'autres feuilles pour voir les infos que je souhaite.
Mais bon, ça m'aurait intéressé de savoir si on pouvait trouver une solution...

carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 05/10/2023 à 14:50 Modifié par Bipbipcoyote


Bonjour,
quand tu construis ton étudiant tu peux ajouter des champs etudiantTrouve[7] (donc etudiantTrouve[8] etc... )dans lesquels tu mets un caractère espace " " avec un setValue, du coup tu auras des colonnes qui "visuellement" seront vides et tes données seront placées comme tu le souhaites
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 06/10/2023 à 01:48 Modifié par Bipbipcoyote


Bonjour,
Ah mais il y a des cellules vides entre nos données, par exemple E7 , E9 E11 etc... sur la feuille "Saisie"
tu peux les nommer Col_D Col_I (bref = les colonnes à "sauter") ces cellules restent vides mais tu les incorpores dans le code, par exemple

let Form_Id = classeur.getRangeByName('Id'); //Saisie A1
let Form_Prenom = classeur.getRangeByName('Prenom');
let Form_Nom = classeur.getRangeByName('Nom');
let Form_Col_D = classeur.getRangeByName('Col_D');
let Form_DNaissance = classeur.getRangeByName('DNaissance');
let Form_Rue = classeur.getRangeByName('Rue');
let Form_CP = classeur.getRangeByName('CP');
let Form_Ville = classeur.getRangeByName('Ville');
let Form_Pays = classeur.getRangeByName('Pays');
let Form_Col_I = classeur.getRangeByName('Col_I');
tu modifies bien entendu le reste du code en conséquence
NB que tu peux faire cela ailleurs, il faut simplement que notre enregistrement contienne des cellules vides ainsi tu peux grouper 2 ou plus de colonnes qui seront remplies avec des valeurs null
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions
gaston gaston
1 618 contributions
Membre depuis le 01/03/2001
Envoyé le 15/10/2023 à 21:45 Modifié par gaston


Bonjour,
Oui, j'avais songé à cela, mais le problème est qu'il peut y avoir des valeurs dans ces colonnes: ce sont des colonnes de totaux ou de récapitulatifs.

J'ai finalement revu ma copie: j'ai enlevé toutes ces colonnes pour ne laisser dans cette feuille que les données modifiables, en vrac. Ensuite je protège cette feuille et je la cache afin qu'on ne la touche pas autrement que par formulaire.
Ensuite, sur d'autres feuilles, je fais des query et c'est là que je mets mes totaux en mettant des arrafyormula dans les entêtes de colonnes, ce qui fait que les totaux et récapitulatif se font tout seuls par ligne, dans toute la colonne et peu importe si l'ordre des lignes est modifié : l'arrayformula se remet à jour tout seul . [8D]


carpe diem
Bipbipcoyote Bipbipcoyote
4 287 contributions
Membre depuis le 06/03/2001
Envoyé le 16/10/2023 à 00:15


Bonjour,
ok si cela te satisfait ainsi, sinon tu peux faire tes sommes ou autres calculs dans le code et injecter les résultats dans les variables qui crée l'objet mais bon tant que cela fonctionne, c'est le principal
Visitez mon Site Google est mon ami, il répond mieux que moi, posez lui d'abord vos questions

Participer à cette discussion

« Retour sur la liste des messages de ce forum