Script case à cocher - doublon de lignes insertRowsBefore
Bonjour à tous et merci par avance pour votre lecture !
Débutant dans les script, je tente de réaliser un fichier de suivi de paris sportifs pour un ami à moi.
Mon but est de créer un formulaire de saisie à chaque nouveau pari réalisé permettant d'alimenter via un script, un tableau contenant l'historique de ses paris. Le formulaire contient des listes déroulantes prenant leur source dans un onglet DATA.
J'ai réussi à créer ce formulaire et la macro associée à l'aide d'une case à cocher pour qu'elle soit fonctionnelle depuis le smartphone. Le script débute par l'ajout d'une ligne au dessus, laissant visible les paris les plus récents.
Mon soucis principal est que lorsque je coche la case, la ligne vient bien compléter mon tableau, mais par moment cela m'ajoute 2 fois ( voir plus ) la même entrée...ce qui ne rend pas mon script viable à 100% car il faut aller supprimer les lignes doublons...
Voici le code actuel ainsi qu'une illustration du problème rencontré :
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleSaisie = fichier.getSheetByName("SAISIE");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleSaisie.getRange(20,3).getValue();
if (estCochee == true)
{
var book = feuilleSaisie.getRange(8,3).getValue();
var sport = feuilleSaisie.getRange(10,3).getValue();
var mise = feuilleSaisie.getRange(12,3).getValue();
var type = feuilleSaisie.getRange(14,3).getValue();
var cote = feuilleSaisie.getRange(16,3).getValue();
var boostee = feuilleSaisie.getRange(4,3).getValue();
var freebet = feuilleSaisie.getRange(6,3).getValue();
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,2).setValue("=TODAY()");
feuilleRecap.getRange(2,1).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,6).setValue(type);
feuilleRecap.getRange(2,7).setValue(mise);
feuilleRecap.getRange(2,8).setValue(cote);
feuilleRecap.getRange(2,9).setValue(boostee);
feuilleRecap.getRange(2,10).setValue(freebet);
feuilleRecap.getRange(2,11).setValue("EN COURS ⏳");
var nouvelleMise = feuilleRecap.getRange(2,1,1,14);
nouvelleMise.setValues( nouvelleMise.getValues() );
feuilleSaisie.getRange(20,3).setValue(false);
}
}
Je reste à l'écoute si vous avez une piste
Dans un second temps, j'aimerais également que soient reprises mes formules présentes dans les colonnes L ( € ) M ( FREEBET ) et N ( TOTAL ) lors de l'ajout de nouvelles lignes.
J'ai tenté de rentrer ces formules dans le script, sans franc succès
Merci pour vos conseils et l'aide apportée
Bonjour,
Essai ce script qui devrait résoudre le problème des doublons et reprendre tes formules dans les nouvelles lignes ajoutées.
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleSaisie = fichier.getSheetByName("SAISIE");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleSaisie.getRange(20,3).getValue();
if (estCochee == true)
{
var book = feuilleSaisie.getRange(8,3).getValue();
var sport = feuilleSaisie.getRange(10,3).getValue();
var mise = feuilleSaisie.getRange(12,3).getValue();
var type = feuilleSaisie.getRange(14,3).getValue();
var cote = feuilleSaisie.getRange(16,3).getValue();
var boostee = feuilleSaisie.getRange(4,3).getValue();
var freebet = feuilleSaisie.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 14);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,2).setValue("=TODAY()");
feuilleRecap.getRange(2,1).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,6).setValue(type);
feuilleRecap.getRange(2,7).setValue(mise);
feuilleRecap.getRange(2,8).setValue(cote);
feuilleRecap.getRange(2,9).setValue(boostee);
feuilleRecap.getRange(2,10).setValue(freebet);
feuilleRecap.getRange(2,11).setValue("EN COURS ⏳");
var nouvelleMise = feuilleRecap.getRange(2,1,1,14);
nouvelleMise.setValues( nouvelleMise.getValues() );
// Obtenez la formule de la cellule L2
var formuleL = feuilleRecap.getRange("L2").getFormula();
// Définissez la formule pour la nouvelle cellule L
feuilleRecap.getRange(2,12).setFormula(formuleL);
// Faites de même pour les cellules M et N
var formuleM = feuilleRecap.getRange("M2").getFormula();
feuilleRecap.getRange(2,13).setFormula(formuleM);
var formuleN = feuilleRecap.getRange("N2").getFormula();
feuilleRecap.getRange(2,14).setFormula(formuleN);
feuilleSaisie.getRange(20,3).setValue(false);
}
}Cdlt
Alex
Bonjour,
Merci beaucoup pour la réponse, je n'avais pas du tout vu
On est d'accord que dans le script que vous m'avez transmis, je dois bien supprimer ce genre de lignes "// Vérifie si l'entrée existe déjà " " // Si l'entrée existe déjà, sortez de la fonction " etc... ?
Sinon, en ce qui concerne les formules à reprendre, quand vous dites "// Obtenez la formule de la cellule L2" il faut que je copie / colle la formule existante de mon fichier dans getFormula() ?
Merci encore à vous
Bonjour,
je dois bien supprimer ce genre de lignes "// Vérifie si l'entrée existe déjà " " // Si l'entrée existe déjà, sortez de la fonction " etc... ?
Non, "ce script qui devrait résoudre le problème des doublons et reprendre tes formules dans les nouvelles lignes ajoutées."
Copie/colle le script que j'ai posté et déclenche le. Si il y a des erreurs poste les.
Ayant apporté des modifications entre temps à mon fichier RECAP, j'ai copié le script ( que j'ai corrigé pour que ça colle à mes colonnes suite à mes ajouts ).
Le bug de doublon semble bien être éradiqué
En revanche, les formules présentes en colonne D / F / M / N / O ne sont pas reprises à l'ajout d'une nouvelle ligne dans le tableau.
Voici le code que j'ai rectifié, ainsi que les en-tête de mon tableau définitif
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleBet = fichier.getSheetByName("BET");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleBet.getRange(19,3).getValue();
if (estCochee == true)
{
var book = feuilleBet.getRange(8,3).getValue();
var sport = feuilleBet.getRange(10,3).getValue();
var mise = feuilleBet.getRange(12,3).getValue();
var type = feuilleBet.getRange(14,3).getValue();
var cote = feuilleBet.getRange(16,3).getValue();
var boostee = feuilleBet.getRange(4,3).getValue();
var freebet = feuilleBet.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 15);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,1).setValue("=TODAY()");
feuilleRecap.getRange(2,2).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,7).setValue(type);
feuilleRecap.getRange(2,8).setValue(mise);
feuilleRecap.getRange(2,9).setValue(cote);
feuilleRecap.getRange(2,10).setValue(boostee);
feuilleRecap.getRange(2,11).setValue(freebet);
feuilleRecap.getRange(2,12).setValue("EN COURS ⏳");
var nouvelleMise = feuilleRecap.getRange(2,1,1,15);
nouvelleMise.setValues( nouvelleMise.getValues() );
// Obtenez la formule de la cellule D2
var formuleD = feuilleRecap.getRange("D2").getFormula();
// Définissez la formule pour la nouvelle cellule D
feuilleRecap.getRange(2,4).setFormula(formuleD);
// Faites de même pour les cellules F et M et N et O
var formuleF = feuilleRecap.getRange("F2").getFormula();
feuilleRecap.getRange(2,6).setFormula(formuleF);
var formuleM = feuilleRecap.getRange("M2").getFormula()
feuilleRecap.getRange(2,13).setFormula(formuleM);
var formuleN = feuilleRecap.getRange("N2").getFormula();
feuilleRecap.getRange(2,14).setFormula(formuleN);
var formuleO = feuilleRecap.getRange("O2").getFormula();
feuilleRecap.getRange(2,15).setFormula(formuleO);
feuilleBet.getRange(19,3).setValue(false);
}
}
Voici les formules que j'ai dans les 5 colonnes :
Colonne D : =SI(C2=0;"";RECHERCHEV(C2;DATA!A:B;2))
Colonne F : =SI(E2=0;"";RECHERCHEV(E2;DATA!D:E;2))
Colonne M : =SI(K3=FAUX;SI(L3="GAGNÉ 💶";(H3*I3)-H3;SI(L3="PERDU 💸";-H3;SI(L3="REMBOURSÉ 💰";"";SI(L3="EN COURS ⏳";""))));"")
Colonne N : =SI(K3=VRAI;SI(L3="GAGNÉ 💶";(H3*I3)-H3;SI(L3="PERDU 💸";"";SI(L3="REMBOURSÉ 💰";0;SI(L3="EN COURS ⏳";""))));"")
Colonne O : =M3+N3
Merci à toi
En effet, essai ça:
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleBet = fichier.getSheetByName("BET");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleBet.getRange(19,3).getValue();
if (estCochee == true)
{
var book = feuilleBet.getRange(8,3).getValue();
var sport = feuilleBet.getRange(10,3).getValue();
var mise = feuilleBet.getRange(12,3).getValue();
var type = feuilleBet.getRange(14,3).getValue();
var cote = feuilleBet.getRange(16,3).getValue();
var boostee = feuilleBet.getRange(4,3).getValue();
var freebet = feuilleBet.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 15);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,1).setValue("=TODAY()");
feuilleRecap.getRange(2,2).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,7).setValue(type);
feuilleRecap.getRange(2,8).setValue(mise);
feuilleRecap.getRange(2,9).setValue(cote);
feuilleRecap.getRange(2,10).setValue(boostee);
feuilleRecap.getRange(2,11).setValue(freebet);
feuilleRecap.getRange(2,12).setValue("EN COURS ⏳");
var nouvelleMise = feuilleRecap.getRange(2,1,1,15);
nouvelleMise.setValues( nouvelleMise.getValues() );
// Obtenez la formule de la cellule D2
var formuleD = feuilleRecap.getRange("D2").getFormula();
// Définissez la formule pour la nouvelle cellule D
feuilleRecap.getRange(2,4).setFormula(formuleD);
// Faites de même pour les cellules F et M et N et O
var formuleF = feuilleRecap.getRange("F2").getFormula();
feuilleRecap.getRange(2,6).setFormula(formuleF);
var formuleM = feuilleRecap.getRange("M2").getFormula()
feuilleRecap.getRange(2,13).setFormula(formuleM);
var formuleN = feuilleRecap.getRange("N2").getFormula();
feuilleRecap.getRange(2,14).setFormula(formuleN);
var formuleO = feuilleRecap.getRange("O2").getFormula();
feuilleRecap.getRange(2,15).setFormula(formuleO);
feuilleBet.getRange(19,3).setValue(false);
}
}Voici les formules que j'ai dans les 5 colonnes :
Colonne D : =SI(C2=0;"";RECHERCHEV(C2;DATA!A:B;2))
Colonne F : =SI(E2=0;"";RECHERCHEV(E2;DATA!D:E;2))
Colonne M : =SI(K3=FAUX;SI(L3="GAGNÉ 💶";(H3*I3)-H3;SI(L3="PERDU 💸";-H3;SI(L3="REMBOURSÉ 💰";"";SI(L3="EN COURS ⏳";""))));"")
Colonne N : =SI(K3=VRAI;SI(L3="GAGNÉ 💶";(H3*I3)-H3;SI(L3="PERDU 💸";"";SI(L3="REMBOURSÉ 💰";0;SI(L3="EN COURS ⏳";""))));"")
Colonne O : =M3+N3
Est-ce que les lignes peuvent ou doivent changer à chaque ajout de ligne par le script ?
Ex: C2 en C3 - E2 en E3 - K3 en K4 etc...............
Difficile sans modèle ou partage de fichier !
sinon essai ça :
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleBet = fichier.getSheetByName("BET");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleBet.getRange(19,3).getValue();
if (estCochee == true)
{
var book = feuilleBet.getRange(8,3).getValue();
var sport = feuilleBet.getRange(10,3).getValue();
var mise = feuilleBet.getRange(12,3).getValue();
var type = feuilleBet.getRange(14,3).getValue();
var cote = feuilleBet.getRange(16,3).getValue();
var boostee = feuilleBet.getRange(4,3).getValue();
var freebet = feuilleBet.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 15);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,1).setValue("=TODAY()");
feuilleRecap.getRange(2,2).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,7).setValue(type);
feuilleRecap.getRange(2,8).setValue(mise);
feuilleRecap.getRange(2,9).setValue(cote);
feuilleRecap.getRange(2,10).setValue(boostee);
feuilleRecap.getRange(2,11).setValue(freebet);
feuilleRecap.getRange(2,12).setValue("EN COURS ⏳");
var nouvelleMise = feuilleRecap.getRange(2,1,1,15);
nouvelleMise.setValues( nouvelleMise.getValues() );
// Obtenez la formule de la cellule D2
var formuleD = feuilleRecap.getRange("D2").getFormulaR1C1();
// Définissez la formule pour la nouvelle cellule D
feuilleRecap.getRange(2,4).setFormulaR1C1(formuleD);
// Faites de même pour les cellules F et M et N et O
var formuleF = feuilleRecap.getRange("F2").getFormulaR1C1();
feuilleRecap.getRange(2,6).setFormulaR1C1(formuleF);
var formuleM = feuilleRecap.getRange("M2").getFormulaR1C1()
feuilleRecap.getRange(2,13).setFormulaR1C1(formuleM);
var formuleN = feuilleRecap.getRange("N2").getFormulaR1C1();
feuilleRecap.getRange(2,14).setFormulaR1C1(formuleN);
var formuleO = feuilleRecap.getRange("O2").getFormulaR1C1();
feuilleRecap.getRange(2,15).setFormulaR1C1(formuleO);
feuilleBet.getRange(19,3).setValue(false);
}
}En effet, j’aurais du le faire dès le début…pas l’habitude
Voici le lien de la copie
https://docs.google.com/spreadsheets/d/1fsj8YJRo_8dfCB1q6n8w_PNe1u6z6DZopUo7-3q2AsI/edit
J'ai demandé un accès. je vais faire une copie.
Oui je l’ai acceptée de suite, tu peux travailler direct sur celui là c’est déjà une copie
Dans ce script, j’ai supprimé les parties qui récupèrent et définissent les formules pour les cellules D, F, M, N et O. Ainsi, lorsque tu ajoutes une nouvelle ligne, les formules ne seront pas prises en compte car elle sont en ligne 1 avec un "ARRAYFORMULA" (en jaune).
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleBet = fichier.getSheetByName("BET");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleBet.getRange(19,3).getValue();
if (estCochee == true)
{
var book = feuilleBet.getRange(8,3).getValue();
var sport = feuilleBet.getRange(10,3).getValue();
var mise = feuilleBet.getRange(12,3).getValue();
var type = feuilleBet.getRange(14,3).getValue();
var cote = feuilleBet.getRange(16,3).getValue();
var boostee = feuilleBet.getRange(4,3).getValue();
var freebet = feuilleBet.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 15);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,1).setValue("=TODAY()");
feuilleRecap.getRange(2,2).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,7).setValue(type);
feuilleRecap.getRange(2,8).setValue(mise);
feuilleRecap.getRange(2,9).setValue(cote);
feuilleRecap.getRange(2,10).setValue(boostee);
feuilleRecap.getRange(2,11).setValue(freebet);
feuilleRecap.getRange(2,12).setValue("EN COURS ⏳");
feuilleBet.getRange(19,3).setValue(false);
}
}De mon côté ça fonctionne, j'ai ajouté une fonction dans la barre de menu "Menu Personnalisé" ==> "Ajouter"
function onOpen() {
var ui = SpreadsheetApp.getUi();
ui.createMenu('Menu personnalisé')
.addItem('Ajouter', 'AJOUTER')
.addToUi();
}
function AJOUTER()
{
var fichier = SpreadsheetApp.getActive();
var feuilleBet = fichier.getSheetByName("BET");
var feuilleRecap = fichier.getSheetByName("RECAP");
var estCochee = feuilleBet.getRange(19,3).getValue();
if (estCochee == true)
{
var book = feuilleBet.getRange(8,3).getValue();
var sport = feuilleBet.getRange(10,3).getValue();
var mise = feuilleBet.getRange(12,3).getValue();
var type = feuilleBet.getRange(14,3).getValue();
var cote = feuilleBet.getRange(16,3).getValue();
var boostee = feuilleBet.getRange(4,3).getValue();
var freebet = feuilleBet.getRange(6,3).getValue();
// Vérifie si l'entrée existe déjà
var range = feuilleRecap.getRange(2, 1, feuilleRecap.getLastRow(), 15);
var values = range.getValues();
for (var i = 0; i < values.length; i++) {
if (values[i][2] == book && values[i][4] == sport && values[i][5] == type && values[i][6] == mise && values[i][7] == cote) {
return; // Si l'entrée existe déjà, sortez de la fonction
}
}
feuilleRecap.insertRowsBefore(2,1);
feuilleRecap.getRange(2,1).setValue("=TODAY()");
feuilleRecap.getRange(2,2).setValue("=WEEKNUM(TODAY())");
feuilleRecap.getRange(2,3).setValue(book);
feuilleRecap.getRange(2,5).setValue(sport);
feuilleRecap.getRange(2,7).setValue(type);
feuilleRecap.getRange(2,8).setValue(mise);
feuilleRecap.getRange(2,9).setValue(cote);
feuilleRecap.getRange(2,10).setValue(boostee);
feuilleRecap.getRange(2,11).setValue(freebet);
feuilleRecap.getRange(2,12).setValue("EN COURS ⏳");
feuilleBet.getRange(19,3).setValue(false);
}
}Bonjour,
Je viens de terminer mon fichier grâce à toi
J'ai compris le principe de la formule ARRAYFORMULA désormais, on en apprends chaque jour.
Le sujet est donc clos !
Bonne journée à toi
Bonjour, en effet de la ligne 2 s'est passé à la ligne 3, j'ai mis les formules en écritures absolues avec $ pour que ça ne se décale plus.
Colonne D :
={"LOGO";ARRAYFORMULA(SI(C$2:C=0;"";RECHERCHEV(C$2:C;DATA!A:B;2;FAUX)))}Colonne M :
={"€";ARRAYFORMULA(SI(K$2:K=FAUX;SI(L$2:L="GAGNÉ 💶";(H$2:H*I$2:I)-H$2:H;SI(L$2:L="PERDU 💸";-H$2:H;SI(L$2:L="REMBOURSÉ 💰";"";SI(L$2:L="EN COURS ⏳";""))));""))}Colonne N :
={"FREEBET";ARRAYFORMULA(SI(K$2:K=VRAI;SI(L$2:L="GAGNÉ 💶";(H$2:H*I$2:I)-H$2:H;SI(L$2:L="PERDU 💸";"";SI(L$2:L="REMBOURSÉ 💰";0;SI(L$2:L="EN COURS ⏳";""))));""))}Colonne O :
={"TOTAL";ARRAYFORMULA(M$2:M+N$2:N)}Pour l'erreur en colonne D il faut tout supprimer de D2 à D
J'ai sans doute clos le sujet trop précipitamment, même en écriture absolue, les formules passent de C$2:C à C$3:C et se décalent à chaque entrée
Pas de souci, je vais voir ça.
Voilà, apparemment ça fonctionne !
C'était dû à quoi ?
Je peux donc copier les formules en D1 / F1 / M1 / N1 / O1 dans mon fichier ?
Je ne parviens pas à exécuter le script sur le fichier test pour voir
