Système d'enchère
Bonjour à tous,
Je suis nouveau ici, donc je vais me présenter. Romain, 28 ans, père de famille.... Je travaille depuis un petit temps sur un sheets et après avoir réussi à mettre en échec ChatGPT sur lequel je m'appuyais pour mes questions (nombreuses...), je me tourne vers des vrais PRO.
Afin d'animer une petite communauté autour d'un jeu, j'ai besoin d'organiser une enchère pour que les 28 joueurs s'arrachent la liste d'article (avec du faux-argent, c'est un jeu, et non un Free-to-play que j'anime lol) via un enchère.
Ce que je cherche donc à faire:
Les colonnes de B à J sont faites pour reprendre les caractéristiques de l'article en vente
La colonne K sert à encoder le prix plancher de mise aux enchères de l'article.
La colonne M sert à afficher la plus grosse enchère actuelle sur l'article faite par un participant.
La colonne N sert à afficher le timer (temps restant avant que l'enchère soit clos)
La colonne O sert à afficher quel club detient l'offre
Les colonnes de P à AQ servent aux 28 participants de l'enchère.
Il y a pas mal de condition à vérifier:
Que chaque personne ne puisse pas dépasser son montant de départ attribué.
Qu'une meilleure offre efface l'offre qui étaient de mise.
Qu'une offre, une fois mise ne puisse plus être retiré tant qu'il n'y a pas de meilleure offre.
Que l'enchère sur l'article soit cloturé au bout de 24h....
ChatGPT m'a proposé un script, mais il y avait une erreur. Je vous le mets, au cas où...
function onEdit(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
// Vérifier si l'édition a été effectuée dans la colonne des enchères actuelles (colonne M)
if (range.getColumn() == 13) { // Colonne M
var row = range.getRow();
var playerName = sheet.getRange(row, 2).getValue(); // Colonne B
var currentBid = e.value;
var highestBid = sheet.getRange(row, 13).getValue(); // Colonne M
// Vérifier si la nouvelle offre est plus élevée que l'enchère actuelle
if (currentBid > highestBid) {
sheet.getRange(row, 13).setValue(currentBid);
sheet.getRange(row, 14).setValue(e.user); // Colonne N - Enregistrez le nom de la personne ayant effectué l'enchère
sheet.getRange(row, 13).protect(); // Verrouillez la cellule contenant l'offre maximale
var timer = 1440; // 24 heures en minutes
sheet.getRange(row, 14).setValue(timer); // Colonne N - Définissez le timer initial à 24 heures (ajustez selon vos besoins)
}
}
}
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
ScriptApp.newTrigger('updateTimers')
.timeBased()
.everyMinutes(1) // Vous pouvez ajuster l'intervalle de rafraîchissement ici
.create();
}
function updateTimers() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var timerValues = sheet.getRange("N2:N").getValues(); // Colonne N - Mettez ici la plage appropriée pour les timers
for (var i = 0; i < timerValues.length; i++) {
var timer = timerValues[i][0];
if (timer > 0) {
timerValues[i][0] -= 1; // Réduisez le timer de 1 minute à chaque mise à jour
}
}
sheet.getRange("N2:N").setValues(timerValues); // Colonne N - Mettez ici la plage appropriée pour les timers
}Si quelqu'un arrive à faire fonctionner mon sheets, je n'en serai qu'éternellement reconnaissant, à travers ça, je réalise un rêve de gosse: Inventeur de jeu, comme je disais quand j'avais 8 ans.
1000 Merci d'avance !
Bonjour,
La colonne M où s'affiche la plus grosse enchère, est définie par le script ? ou bien une formule de type =MAX( ?
Car le script présenté semble partir de cet élément, mais l'event onEdit n'est pas lancé par une formule, donc c'est le chat qui se mord la queue.
Envoyez une version en lecture seule et accessible de votre besoin, je pense que c'est réalisable, dites-moi si je me trompe dans le déroulé :
1 : admin ajout item et caractéristiques (B + J + K )
2 : des fonctions passivent se lancent et durent tout le long de l'enchère, M affiche le bit max, O l'enchérisseur, N affiche le timer.
3 : les enchérisseurs ont un montant max (où est il ?), pour enchérir, ils doivent écrire le montant ? Cliquer sur un bouton ? popup ? + il faut définir le minimum, K au lancement, mais ensuite, enchère max précédente ? Doit-il y avoir un temps de freeze durant lequel personne ne peut sur-encherir ?
4 : l'enchère est enregistrée, bloquée tant qu'elle est la plus forte, si finale, elle est remportée et le système se bloque, enregistrant les data.
Bonjour,
Voici le lien: https://docs.google.com/spreadsheets/d/11WjsLNqdH1pV6HISoTfBbxKtyQsng4G5Orp4ZTucvb8/edit?usp=sharing
Le fichier est sans aucune mise en page, je souhaitais avant tout arriver à mon but avec ChatGPT avant de m'attaquer à la mise en page. Si nécessaire, je peux la faire avant que vous y regardiez.
Concernant la colonne M, j'avais encodé un =Max() mais je ne sais pas quelle est la meilleure solution. A vous de me dire. Pour moi, tant que ça affiche la plus grosse enchère,
Déjà, merci pour la première réponse !
1: Admin ajoute les infos de l'item de B à K, et non juste B+J+K
2: Oui, tout au long de l'enchère il faut que les colonnes N (enchère max) O (timer) et P (personne ayant fait l'offre maximale) soit affiché.
3: Les enchérisseurs ont un montant max, encodé par l'admin, qui se situe dans les cellules Q4 à AR4.
J'aimerai ajouter une ligne en 5, pour calculer le montant restant de chaque personne suivant les offres qu'il a faite.
Pour enchérir, ils doivent écrire le montant dans la colonne qui leur appartient, et sur la ligne de l'item qu'ils veulent. Il faudrait donc aussi, que chaque personne puisse uniquement écrire dans sa colonne et non celle d'un collègue.
Alors je pensais absolument pas que c'était possible (la fonction RechercheV pour le tableau mère a été comme si je trouvais l'Amérique, c'est dire mon niveau ^^), mais oui j'aimerai pouvoir paramétrer le montant maximum qu'il est possible d'ajouter à une enchère. (Il évoluera au fil des années)
Non pas de freeze durant lequel personne ne peut enchérir.
Par contre, une fois qu'une offre est posé, la personne ne doit pas pouvoir la retirer.
4: Exactement.
La dernière chose que je pensais gérer via un ajout du montant au budget de la personne, c'est que chaque personne peut aussi mettre en vente des items achetable par les autres membres. Il faut que le montant s'ajoute au budget du vendeur...
Si c'est possible, quel plaisir... D'avance merci !
Bonjour,
Personne n'a la bonne formule pour réussir à faire fonctionner mon sheets ?
Bonjour,
Pas eu le temps de m'y pencher, il faut penser l'architecture, créer les fonctions, s'assurer que tout fonctionne en symbiose, parer les éventualités.
C'est réalisable, sans problème, mais nécessite d'y passer un peu de temps.
Bonjour,
Voici déjà un début, déclaration des variables et constantes globales et une fonction qui vérifie la date de lancement des enchères, puis mets à jour le timer :
En parallèle, il retourne un boléen sur chaque vente, true si l'enchère est en cours, false si pas encore débutée / terminée.
Le but de cette fonction est de se lancer au minima à l'ouverture du fichier, à chaque modification, ensuite tout dépend de votre souhait sur la mise à jour du timer.
Ce qui reste ensuite à faire :
- ajouter une fonction qui protège les lignes ou l'enchère est inactive (false)
- ajouter une fonction onEdit() qui récupère les données inscrites par les club, vérifie si OK (nombre positif, dans leur budget + au dessus du montant de base / BEST) et si oui, mets à jour le best et club détenteur et le montant disponible restant.
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEETENCHERE = SS.getSheetByName("Feuille 3");
var TEMPSENCHERE = SHEETENCHERE.getRange("F1").getValue();
var LISTEVENTE = SHEETENCHERE.getRange(5,2,SHEETENCHERE.getLastRow(),12).getValues();
for (var i = 0; i < LISTEVENTE.length; i++) {
LISTEVENTE[i].push(false);}
var CLUBS = SHEETENCHERE.getRange(3,18,2,28);
var NBVENTES = LISTEVENTE.length;
var NOW = new Date();
var NOWMin = new Date(NOW);
NOWMin.setHours(NOWMin.getHours()-TEMPSENCHERE);
var BEST = SHEETENCHERE.getRange(5,15,NBVENTES,1);
var TIMER = SHEETENCHERE.getRange(5,16,NBVENTES,1);
var DETENTEUR = SHEETENCHERE.getRange(5,17,NBVENTES,1);
function suiviEnchere(){
for (i=0;i<NBVENTES;i++){
var dateVente = new Date(LISTEVENTE[i][11]);
if(dateVente>NOWMin){
var differenceEnMillisecondes = dateVente - NOWMin;
var jours = Math.floor(differenceEnMillisecondes / (1000 * 60 * 60 * 24));
differenceEnMillisecondes -= jours * (1000 * 60 * 60 * 24);
var heures = Math.floor(differenceEnMillisecondes / (1000 * 60 * 60));
differenceEnMillisecondes -= heures * (1000 * 60 * 60);
var minutes = Math.floor(differenceEnMillisecondes / (1000 * 60));
differenceEnMillisecondes -= minutes * (1000 * 60);
var secondes = Math.floor(differenceEnMillisecondes / 1000);
if (jours <= 1){
var tempsRestant = Utilities.formatString("%02d:%02d:%02d", heures, minutes, secondes);
TIMER.getCell(i + 1, 1).setValue(tempsRestant);
LISTEVENTE[i][13] = true
}
else if (jours >1){
TIMER.getCell(i+1,1).setValue("en attente")
}
}
else if (dateVente<NOWMin){
TIMER.getCell(i+1,1).setValue("terminé")
}}
return LISTEVENTE}Bonjour,
Alors, j'ai quelques peu remis en page, et normalement j'ai fait attention à mettre à jour les lignes de code.
function myFunction() {
const SS = SpreadsheetApp.getActiveSpreadsheet();
const SHEETENCHERE = SS.getSheetByName("Feuille 3");
var TEMPSENCHERE = SHEETENCHERE.getRange("F1").getValue();
var LISTEVENTE = SHEETENCHERE.getRange(6,2,SHEETENCHERE.getLastRow(),12).getValues();
for (var i = 0; i < LISTEVENTE.length; i++) {
LISTEVENTE[i].push(false);}
var CLUBS = SHEETENCHERE.getRange(3,18,2,29);
var NBVENTES = LISTEVENTE.length;
var NOW = new Date();
var NOWMin = new Date(NOW);
NOWMin.setHours(NOWMin.getHours()-TEMPSENCHERE);
var BEST = SHEETENCHERE.getRange(5,14,NBVENTES,1);
var TIMER = SHEETENCHERE.getRange(5,15,NBVENTES,1);
var DETENTEUR = SHEETENCHERE.getRange(5,16,NBVENTES,1);
function suiviEnchere(){
for (i=0;i<NBVENTES;i++){
var dateVente = new Date(LISTEVENTE[i][11]);
if(dateVente>NOWMin){
var differenceEnMillisecondes = dateVente - NOWMin;
var jours = Math.floor(differenceEnMillisecondes / (1000 * 60 * 60 * 24));
differenceEnMillisecondes -= jours * (1000 * 60 * 60 * 24);
var heures = Math.floor(differenceEnMillisecondes / (1000 * 60 * 60));
differenceEnMillisecondes -= heures * (1000 * 60 * 60);
var minutes = Math.floor(differenceEnMillisecondes / (1000 * 60));
differenceEnMillisecondes -= minutes * (1000 * 60);
var secondes = Math.floor(differenceEnMillisecondes / 1000);
if (jours <= 1){
var tempsRestant = Utilities.formatString("%02d:%02d:%02d", heures, minutes, secondes);
TIMER.getCell(i + 1, 1).setValue(tempsRestant);
LISTEVENTE[i][13] = true
}
else if (jours >1){
TIMER.getCell(i+1,1).setValue("en attente")
}
}
else if (dateVente<NOWMin){
TIMER.getCell(i+1,1).setValue("terminé")
}}
return LISTEVENTE}
}Comment ça se passe pour que les cellules "Début" et "Timer" s'active ? Je n'ai pas bien compris, sûrement pour lancer le script que je rate quelque chose
Bonjour, la date et heure de début d'enchère est à compléter, puis, lorsque la date est atteinte, l'enchère dure le temps que vous avez mis en F1 et le timer se mets à jour à chaque exécution de la fonction suiviEnchere
Je dois mal faire quelque chose. Y a-t-il une formule à rentrer dans la colonne Timer ?
J'aurai voulu que le "temps restant" soit réinitialisé à chaque nouvel enchère supérieur à la "meilleur offre" en cours. La durée suite à une nouvelle offre est paramétré dans "F1". Et du coup, le "Début" s'active au moment de la première offre. Tant que personne ne fait d'offre, la vente ne démarre pas.
Si je comprends un peu le principe, le déclencheur du "Début", ainsi que le "temps restant" doit être le moment ou un montant dans les colonnes "R" à "AS" est rentré.
Mes excuses si ces points n'étaient pas claire dans ma première explication.
Ok ok, donc les ventes sont en attente et quand quelqu'un fait une offre, c'est à ce moment que le timer se met en marche.
C'est une autre logique, ainsi, il faudrait :
Un script liste les enchères, et les mettent en situation "inactive" et conserve les données des terminées.
Un script timer (ou bien imbriqué dans le précédent ou bien séparé).
Le script d'enchère, lorsque la 1ere enchère est lancée, active la vente et ainsi lance le timer, mais qui fasse aussi la gestion de la meilleure offre et des nouvelle enchères possible.
Est ce que ceci est une bonne base ?
Pour accomplir ce que vous décrivez, il vous faudra combiner des déclencheurs de script basés sur des modifications (onEdit) et un suivi du temps pour mettre à jour les enchères et les timers. Voici comment vous pouvez adapter le code pour atteindre cet objectif :
- Créez un déclencheur basé sur la modification (
onEdit) pour détecter lorsque des offres sont déposées par les clubs dans les colonnes "R" à "AS". - Dans la fonction
onEdit, vérifiez si la modification est effectuée dans les colonnes "R" à "AS" et si c'est le cas, démarrez ou mettez à jour l'enchère pour ce joueur. - Pour chaque offre d'un club sur un joueur, vous devrez réinitialiser le timer à la durée spécifiée en "F1". Utilisez la bibliothèque de temps de Google Apps Script pour gérer le temps.
- Assurez-vous que le montant total des offres d'un club dans une colonne est inférieur ou égal à son "Budget restant" dans les colonnes "R5" à "AS5". Vous devrez vérifier cela à chaque offre et empêcher les offres qui dépassent le budget.
- Pour effacer l'offre battue, vous pouvez simplement effacer la cellule lorsque l'offre d'un autre club est supérieure.
Voici une structure de code générale pour vous aider à démarrer :
function onEdit(e) {
var sheet = e.source;
var range = e.range;
// Vérifiez si l'édition est dans les colonnes "R" à "AS" (18 à 45)
if (range.getColumn() >= 18 && range.getColumn() <= 45) {
var row = range.getRow();
var playerName = sheet.getRange(row, 2).getValue(); // Colonne B
var currentBid = e.value;
// Vérifiez si l'offre est valide (inférieure au budget du club, etc.)
var participantBudgetColumn = range.getColumn();
var participantBudget = sheet.getRange(5, participantBudgetColumn).getValue(); // Ligne 5
// Ajoutez ici la logique de validation des offres
if (validateBid(currentBid, participantBudget)) {
// Mettez à jour l'enchère et réinitialisez le timer
updateAuction(playerName);
// Effacez l'offre battue
clearBid(row, range.getColumn());
}
}
}
function startAuction(playerName) {
// Démarrez l'enchère pour un joueur spécifique
// Ajoutez ici la logique pour démarrer l'enchère
}
function updateAuction(playerName) {
// Mettez à jour l'enchère pour un joueur spécifique
// Ajoutez ici la logique pour mettre à jour l'enchère
}
function clearBid(row, column) {
// Effacez l'offre dans une cellule spécifique
// Ajoutez ici la logique pour effacer l'offre
}
function validateBid(currentBid, participantBudget) {
// Validez une offre (vérifiez si elle est inférieure au budget, etc.)
// Ajoutez ici la logique de validation des offres
return currentBid <= participantBudget; // Exemple de validation
}Bien que je ne sache pas réellement l'utilité que ça avait, sûrement pour se faciliter le langage du code dans les lignes suivantes, je trouvais sympa la déclaration du nom des différentes variables.
Ça semble globalement correct, il manque la prise en compte de la validité ou non de la vente, le montant de base, la partie timer, la mise en protection des données, mais la structure est un bon début oui.
Voici, j'ai été au bout de ce que pouvais me donner ChatGPT (couplé à ma connaissance) :
const AUCTION_SHEET_NAME = "MercatoAlbagard";
const BUDGET_ROW = 4;
const BASE_PRICE_COLUMN = getColumnNumber("L");
const TIMER_DURATION_CELL = "F1";
const TIMER_INCREMENT = "F2";
function onEdit(e) {
var sheet = e.source.getSheetByName(MercatoAlbagard);
var range = e.range;
// Vérifier si l'édition a été effectuée dans les colonnes des enchères des participants (de R à AS)
var column = range.getColumn();
if (column >= getColumnNumber("R") && column <= getColumnNumber("AS")) {
var row = range.getRow();
var playerName = sheet.getRange(row, getColumnNumber("B")).getValue(); // Colonne B
var currentBid = e.value;
var highestBid = sheet.getRange(row, getColumnNumber("N")).getValue(); // Colonne N
// Vérifier si la nouvelle offre est plus élevée que l'enchère actuelle et inférieure ou égale au budget de départ du participant
var participantBudgetColumn = column;
var participantBudget = sheet.getRange(BUDGET_ROW, participantBudgetColumn).getValue();
// Vérifier si la somme des enchères du participant reste inférieure ou égale à son budget
var playerBids = sheet.getRange(row, getColumnNumber("R"), 1, getColumnNumber("AS") - getColumnNumber("R") + 1).getValues()[0];
var totalBids = playerBids.reduce(function (sum, bid) {
return sum + bid;
}, 0);
if (currentBid > highestBid && currentBid <= participantBudget && totalBids + currentBid <= participantBudget) {
// Effacer l'offre inférieure si une offre supérieure est faite
for (var i = getColumnNumber("R"); i <= getColumnNumber("AS"); i++) {
if (i !== column) {
sheet.getRange(row, i).setValue(""); // Effacer l'offre dans la colonne correspondante
}
}
// Mettre à jour l'offre la plus élevée et le nom de l'enchérisseur
sheet.getRange(row, getColumnNumber("N")).setValue(currentBid); // Colonne N
sheet.getRange(row, getColumnNumber("P")).setValue(e.user); // Colonne P - Enregistrez le nom de la personne ayant effectué l'enchère
var timerDuration = parseInt(sheet.getRange(TIMER_DURATION_CELL).getValue()); // Récupérez la durée du timer depuis la cellule F1
var timer = timerDuration * 60; // Convertissez la durée en minutes
sheet.getRange(row, getColumnNumber("O")).setValue(timer); // Colonne O - Définissez le timer initial en minutes
}
}
}
function onOpen() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AUCTION_SHEET_NAME);
ScriptApp.newTrigger('updateTimers')
.timeBased()
.everyMinutes(1) // Vous pouvez ajuster l'intervalle de rafraîchissement ici
.create();
}
function updateTimers() {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(AUCTION_SHEET_NAME);
var timerValues = sheet.getRange("O2:O" + sheet.getLastRow()).getValues(); // Colonne O - Mettez ici la plage appropriée pour les timers
for (var i = 0; i < timerValues.length; i++) {
var timer = timerValues[i][0];
if (timer > 0) {
timerValues[i][0] -= 1; // Réduisez le timer de 1 minute à chaque mise à jour
}
}
sheet.getRange("O2:O" + sheet.getLastRow()).setValues(timerValues); // Colonne O - Mettez ici la plage appropriée pour les timers
}
function getColumnNumber(columnLetter) {
// Cette fonction convertit une lettre de colonne en numéro de colonne
return columnLetter.charCodeAt(0) - 65 + 1;
}Dès la première ligne du onEdit, le script me dit qu'il y a une erreur... Pouvez-vous m'aider ?
Et est ce que le code là paraît cohérent ?
Bonjour,
Quelle est l'erreur ? la ligne concernée ?
Je pense que vous devriez tester fonction par fonction si tout fonctionne à l'aide de Logger.log ainsi, vous verrez si tout marche.
Après lecture, il y a ce point qui me semble à vérifier :
// Vérifier si la somme des enchères du participant reste inférieure ou égale à son budget
var playerBids = sheet.getRange(row, getColumnNumber("R"), 1, getColumnNumber("AS") - getColumnNumber("R") + 1).getValues()[0];
var totalBids = playerBids.reduce(function (sum, bid) {
return sum + bid;
}, 0);Pourquoi faire aussi complexe ? il suffit de prendre la donnée écrite par l'utilisateur et comparer à son montant disponible.
C'est Chat GPT qui a fait aussi complexe. Pourquoi il n'a pas fait plus simple, c'est une très bonne question... Franchement, je comprends +ou- le principe du code, mais j'suis incapable de taper une seule ligne de ceci
Voici l'explication que je lui ai donné:
Alors.
Commençons par les constantes:
"F1" sera le temps à ajouter lorsque une offre sera faite : "NEW TIME BID"
"F2" sera le palier maximum supplémentaire que l'on pourra ajouter à l'offre à cours "PALIER NOUVELLE OFFRE"
Les colonnes "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" contiennent les informations sur le joueur en vente: "INFOS JOUEURS"
La colonne "L" contient le prix de base du joueur : "PRIX BASE"
La colonne "M" contient l'heure à laquelle une offre sera faite : "HEURE OFFRE"
La colonne "N" contient la meilleure offre "MEILLEURE OFFRE" (nous y revenons après)
La colonne "O" contient le temps restant pour faire une offre: "TIMER"
La colonne "P" contient le club détenteur de la MEILLEURE OFFRE" : "OFFREUR"
Ensuite nous arrivons aux clubs:
Chaque club est définit par une colonne, de la colonne R à AS.
Le budget de départ de chaque club est renseigné dans la colonne correspondante, en ligne 4, donc de R4 à AS4.
Le budget restant est le montant de départ, moins les offres que le club a faite, calculé dans la ligne 5.
Les offres des clubs se feront à partir de la ligne 5, toujours dans les colonnes R à AS, et il pourra descendre sur chaque ligne ou il y a des "INFOS JOUEURS" de renseigné.
Concernant le système:
Lorsque aucune offre n'est encodé pour un joueur, l'enchère ne commence pas. Tu peux renvoyer une valeur false.
Lorsque une offre est encodé, il faut vérifier plusieurs conditions:
- Si aucune offre, le montant de l'offre doit être supérieur à "PRIX BASE" être au maximum de "PRIX BASE" + "PALIER NOUVELLE OFFRE". L'offre posé par le club sera la "MEILLEURE OFFRE"
Il faut vérifier que le club a le BUDGET RESTANT nécessaire pour faire l'offre.
Le TIMER peut débuter en encodant l'heure départ et en enclanchant le TIMER suivant F1
- S'il y a déjà une "MEILLEURE OFFRE", il faut que la NOUVELLE OFFRE soit supérieure, en dépassant pas "MEILLEURE OFFRE" + PALIER NOUVELLE OFFRE".
Il faut vérifier que le club a le BUDGET RESTANT nécessaire pour faire l'offre.
Le TIMER peut débuter en réinitialisant l'heure de départ et en enclanchant le timer suivant F1
Il faut dans le même temps effacer l'offre précédente des offres du club comme son offre a été battu.
En règle général, il ne peut donc y avoir qu'une seule offre sur la ligne d'un joueur, car chaque fois qu'une meilleure offre est déposé par un autre club, cela efface l'offre précédente (afin que le club qui avait la meilleure offre, mais qui ne l'a plus retrouve son budget).
Si ces conditions sont vérifié, le TIMER peut s'enclencher est renvoyé une valeur true sur l'enchère.
Si le Timer arrive à son terme, l'enchère sur le joueur est terminé.
Ce qui veut dire:
- Plus possible de faire une offre supérieur, le joueur a été vendu.
Aussi en plus, j'aimerai qu'une offre faite par un club sur un joueur ne puisse pas être retiré, ni modifié (afin de ne pas pouvoir faire de surproposition sur sa propre offre, ce qui rendrait la notion PALIER NOUVELLE OFFRE obselète...). Une fois que l'on a fait offre, il existe deux possibilités:
- Une meilleure offre est posé, et l'enchère suit son cour.
- Aucune meilleure offre est posé, et l'enchère se termine à la fin du TIMER.L'erreur est parfaitement normale ici, onEdit attend un événement pour se lancer et utilise cet événement (représenté par "e").
Si vous le lancez directement dans la fenêtre, il n'y a pas de modification, donc pas de "e", quand vous simulez un bit dans le fichier ça ne fonctionne pas ?
Non, l'heure de l'offre ne se met pas automatiquement, ni le temps restant, ni le club détenteur, ni le budget restant et si je pose deux offres sur la même ligne, l'offre inférieur ne s'efface pas... Rien quoi
Je dois en plus du script ecrire des formules dans le sheets pour rendre ça automatique ? Ou c'est le script qui ne fonctionne pas ?
... c'est le souci de chatGPT, il peut fournir une aide dans la structuration d'un code, une tâche très précise, convertir du code, relever des erreurs de saisie, mais pour ce qui est d'écrire un script à 0 en prenant en compte tous les tenants et aboutissant, il est quelque peu...débile (je lui dis souvent).
Je vais copier votre fichier, le code proposé par chatGPT et voir s'il y a moyen d'en tirer quelque chose.
Oui je me doute, quand j'arrive moi à lui dire "Tu as fait quoi là ? ça sert à quoi ?" et qu'il me répond qu'il a merdé.... Je me dis qu'on peut encore lui râler dessus un peu, c'est pas demain qu'il deviendra Terminator
Merci et hâte de voir ça ! (sans mettre aucune pression, c'est assez poussé et ça demande un peu de temps ce que je demande, tout ça est déjà bien sympa)
Bonjour,
Est-ce que quelqu'un arriverait à résoudre ça ?
D'avance merci :-)