web-dev-qa-db-fra.com

Empêcher l'erreur "invoqué trop de fois par seconde" dans le script Google Apps

J'ai une feuille de calcul Google composée de différents mois sur chaque onglet. Chaque mois, j'ajoute un nouvel onglet et encore 50 à 75 lignes. Il y a beaucoup d'onglets. Il y a une cellule sur chaque ligne qui appelle une fonction personnalisée, comme ceci:

=myFunction(A1)

Le problème que j'ai est que je reçois l'erreur suivante:

erreur: le script a été invoqué trop souvent par seconde pour ce compte d'utilisateur Google.

Que puis-je faire pour éviter cette erreur?

Le problème est-il dû au fait qu'il y a trop d'onglets ou de lignes par onglet?

Il doit exister un moyen d’empêcher la fonction de fonctionner plus d’une fois.


Voici une version abrégée de la fonction appelée:

function myFunction(expense) {
if (
  InStr(1,expense,"CPC SCP") ||
  InStr(1,expense,"CPC/SCP") ||
  InStr(1,expense,"xxxx")
  )
  { category = "5530 - Postage Expense" } 

  else if (
  InStr(1,expense,"PRE-AUTHORIZED PAYMENT") ||
  InStr(1,expense,"xxx ")
  )
  { category = "9999 - Payment" } 

  else if (
  InStr(1,expense,"PURCHASE INTEREST") ||
  InStr(1,expense,"RETURNED PAYMENT FEE") ||
  InStr(1,expense,"xxxx")
  )
  { category = "5070 - Bank Charges" } 

else { category = "Not Sure" }

return category;  

} 
2
DanielAttard

Mieux vaut préparer un résultat pour une plage au lieu de traiter avec une cellule individuelle. Lorsque vous ouvrez le fichier, il doit traiter toutes les cellules individuellement. Cela a finalement provoqué l'erreur. J'ai donc créé le code ci-dessous.

Code

function catExp_1(range) {
  var output = [], arr = JSON.parse(createArr());
  for(var j=0, jLen=range.length; j<jLen; j++) {
    var result = "Not Sure";
    for(var i=0, iLen=arr.length; i<iLen; i++) {      
      for(var k=0, kLen=arr[i][1].length; k<kLen; k++) {        
        if(range[j][0].indexOf(arr[i][1][k]) != -1) {
          result = arr[i][0];
        }
      }      
    }
    output.Push([result]);
  }
  return output;
}

function createArr() {
  // check for availability
  var cache = CacheService.getPublicCache();
  var cached = cache.get("accounts");
  if (cached != null) {  
    return cached;
  }

  // create array
  var arr = [    
    [["5070 - Bank Charges"],["PURCHASE INTEREST", "xxxx"]],
    [["5530 - Postage Expense"],["CPC SCP","xxxx"]],
    [["9999 - xxxxxxx"],["xxxxxxxx"]]
  ];

  // add to cache
  var jsonData = JSON.stringify(arr);
  cache.put("accounts", jsonData, 21000);
  return jsonData;
}

A expliqué

Le premier script créera un tableau de sortie et collectera les données de recherche. Ceci est soit stocké dans le cache, soit préparé à la volée (et stocké dans le cache pour la prochaine fois). L'itération commence par une catégorie Not Sure. Si une correspondance est trouvée, la valeur correspondante sera Push dans le tableau de sortie. Sinon, le Not Sure sera ajouté.

Usage

=catExp_1(B2:B133)

Remarque

Vous voudrez peut-être envisager d'ajouter les catégories plutôt que de les rechercher. Cela élimine tout retard du script. Vous pouvez facilement créer un élément de menu qui effectue cela.

1