Comment éviter que mon script relance les calculs à chaque fois

Bonjour à tous,

J'ai un script qui fonctionne bien mais j'aimerais qu'il ne relance pas les calculs automatiquement à chaque rafraichissement de la page ou chaque nouvelle connexion concernant toutes les dates antérieurs à celle du jour.

Voici le petit script en question :

function SommeCellulesdeCouleur(sumRange, colorRef) {

var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();

var activeSheet = activeSpreadsheet.getSheetByName("MP CBP WIN ZEB BET UNI");

var formule = activeSheet.getActiveCell().getFormula();

var sumRange = formule.match(/\((.*)\;/).pop();

var range = activeSheet.getRange(sumRange);

var bg = range.getBackgrounds();

var values = range.getValues();

var colorRef = formule.match(/\;(.*)\)/).pop();

var colorCell = activeSheet.getRange(colorRef);

var color = colorCell.getBackground();

var total = 0;

for (var i = 0; i < bg.length; i++)

for (var j = 0; j < bg[0].length; j++)

if (bg[i][j] == color && isTypeNumber(values[i][j]))

total = total + (values[i][j] * 1);

return total;

}

function isTypeNumber(arg) {

return typeof arg == 'number';

}

Ensuite, dans la cellule qui m'intéresse, je rentre cette formule "=SommeCellulesdeCouleur($C34:$AN34;$C$34)" et il me fait la somme des cellules d'une certaine couleur uniquement.

Quelqu'un pourrait-il juste me modifier mon script pour que les calculs déjà faits sur les dates antérieurs à la date du jour ne changent pas à chaque nouvelle connexion ou rafraichissement et que seules les données de la date du jour soient concernées ?

Merci d'avance à vous.

Bien cordialement.

Essai ça :

Avec cette modification, le script vérifie d'abord s'il existe déjà des résultats en cache pour la date du jour. Si c'est le cas, il les utilise directement sans recalculer. Sinon, il effectue le calcul comme d'habitude et met les résultats en cache pour une utilisation ultérieure.

function SommeCellulesdeCouleur(sumRange, colorRef) {
  var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var activeSheet = activeSpreadsheet.getSheetByName("MP CBP WIN ZEB BET UNI");
  var formule = activeSheet.getActiveCell().getFormula();
  var sumRange = formule.match(/\((.*)\;/).pop();
  var range = activeSheet.getRange(sumRange);
  var bg = range.getBackgrounds();
  var values = range.getValues();
  var colorRef = formule.match(/\;(.*)\)/).pop();
  var colorCell = activeSheet.getRange(colorRef);
  var color = colorCell.getBackground();
  var total = 0;

  // Récupération de la date du jour
  var today = new Date();
  var todayDateString = Utilities.formatDate(today, Session.getScriptTimeZone(), "yyyy-MM-dd");

  // Vérification si les résultats pour la date du jour sont déjà en cache
  var cache = CacheService.getUserCache();
  var cachedData = cache.get(todayDateString);

  if (cachedData != null) {
    total = Number(cachedData);
  } else {
    // Calcul de la somme pour la date du jour
    for (var i = 0; i < bg.length; i++) {
      for (var j = 0; j < bg[0].length; j++) {
        if (bg[i][j] == color && isTypeNumber(values[i][j])) {
          total = total + (values[i][j] * 1);
        }
      }
    }
    // Mise en cache du résultat
    cache.put(todayDateString, total);
  }

  return total;
}

function isTypeNumber(arg) {
  return typeof arg == 'number';
}

Merci Alexander, j'ai essayé le script mais il y a une erreur que voici : TypeError: Cannot read properties of null (reading 'pop')SommeCellulesdeCouleur@ Code.gs:5

J'ai mis le lien du tableau sur Google sheet pour que ce soit plus simple.

Je te remercie encore pour ton aide.

Bien cordialement.

https://docs.google.com/spreadsheets/d/1isuB9NdZY_pKe5lwE4q_d-xaszT60Tqb1uVydTYqNlw/edit?usp=sharing

Bonjour,

Je crois qu'il n'est pas possible de "figer" une formule, elle est de nature dynamique.

Une solution serai de se passer de formule mais d'adapter le script pour qu'il note de manière définitive le résultat à un endroit souhaité.

Primo, si vous souhaitez continuer d'utiliser une formule personnalisé, je vous invite à la simplifier et ajouter de la suggestion de saisie pour aider l'utilisateur final :

/**
 * Compte le nombre de cellules avec une couleur spécifique dans une plage donnée.
 * (uniquement les valeurs numériques)
 *
 * @param {string} sumRange La plage de cellules à vérifier (par exemple, "A1:F41").
 * @param {string} colorRef La référence de cellule pour obtenir la couleur à compter (par exemple, "L36").
 * @return {number} Le nombre total de cellules de la même couleur que la cellule de référence qui contiennent des valeurs numériques.
 * @customfunction
 */
function SommeCellulesdeCouleur(sumRange, colorRef) {
  var activeRange = SpreadsheetApp.getActiveRange();
  var activeSheet = activeRange.getSheet();
  var formula = activeRange.getFormula();
  var rangeA1Notation = formula.match(/\((.*);/).pop();
  var colorCellA1Notation = formula.match(/;(.*)\)/).pop();
  var range = activeSheet.getRange(rangeA1Notation);
  var colorCell = activeSheet.getRange(colorCellA1Notation);
  var bg = range.getBackgrounds();
  var values = range.getValues();
  var color = colorCell.getBackground();
  var total = 0;
  for (var i = 0; i < bg.length; i++) {
    for (var j = 0; j < bg[i].length; j++) {
      var cellValue = values[i][j];
      if (bg[i][j] === color && typeof cellValue === 'number' && !isNaN(cellValue)) {
        total ++;
      }
    }
  }
  return total;
}

Ensuite, pouvez vous décrire votre usage de cette formule, afin de voir ce qui peut être fait en script, sans passer par une formule perso et ainsi, éviter les recalculs intempestifs ?

J'ai fais quelques modifications, les dates s'appliquent avec une seule formule en en-tête : "A1" "H1" "Q1" "AD1" "AK1"

A1:

={"Dates";ARRAYFORMULA(DATE(2022;11;18)+LIGNE($A$2:$A))}

H1: Etc.

={"Dates";ARRAYFORMULA(SI($A$2:$A="";;$A$2:$A))}

j'aimerais qu'il ne relance pas les calculs automatiquement à chaque rafraichissement de la page ou chaque nouvelle connexion concernant toutes les dates antérieurs à celle du jour.

c'est le cas, d'abord tu mets ton chiffre dans la cellule "chargement en cours" lorsqu'il a fini son calcul tu peux mettre la couleur.

PS: si tu mets la couleur avant il n'y aura pas de calcul.

https://docs.google.com/spreadsheets/d/1gOirWlkBqTbD22BJDbGRPLhzYRYkge0h2FmI5wLzlvs/edit#gid=1006725...

Tout d'abord, merci à tous les deux pour votre aide précieuse.

J'ai testé mais le résultat n'est pas toujours bon. J'ai mis en rouge les premières cellules fausses. En effet, ce que je souhaite c'est que, pour chaque ligne correspondant à une date, j'aimerais qu'en colonne AM qui s'appelle "gagné", il me fasse la somme des cellules uniquement en bleu, c'est à dire celles qui sont gagnées. Ainsi, dès la 3è ligne, le résultat est faux puisque si je fais la somme des cellules en bleu, je devrais avoir le nombre 11.6 qui s'affiche or là il m'affiche 2. Certaines cellules sont justes mais d'autres pas. J'ai fait tous les calculs en manuel sur la colonne AN et je devrais donc avoir en calcul automatique en AM exactement le même résultat qu'en AN. Dans plusieurs cas, le résultat est faux.

SI vous comprenez le problème et êtes en mesure de le régler, je vous remercie par avance pour votre aide mais si c'est trop compliqué, tant pis, ne vous embêtez pas, c'est peut-être plus complexe que je ne le pensais. Si tout cela peut être fait uniquement par un script sans formule, ça me va aussi très bien.

Un grand merci à vous.

J'ai relancé le test avec ce que vous m'avez proposé et, contrairement à ce que je viens d'écrire, cela semble marcher parfaitement bien. Les calculs ont été relancés et ils semblent justes. Je vous remercie grandement pour votre aide.

C'est très gentil de votre part.

Passez un bon weekend !

Pas de souci, si ton problème est résolu n'oublie pas de clore le sujet avec

Rechercher des sujets similaires à "comment eviter que mon script relance calculs chaque fois"