Mon objectif est assez simple: prendre la valeur dans la colonne U et vérifier si elle se situe dans des plages particulières. Si c'est 1–100, mettez 1 dans la colonne A. Si c'est 101–200, mettez un 2 dans la colonne A. Le problème est que j'ai presque 2000 lignes de nombres dans la colonne U. Mettre =function(U2)
dans chaque cellule dans la colonne A résulte en un
Script invoqué trop de fois par seconde
erreur, et ajouter Utilities.sleep(500)
à la fin n'aide pas non plus. Voici mon code jusqu'à présent. Veuillez excuser la laideur, car je suis un programmeur très débutant.
function assignBoxNumber(sgNumber) {
if(sgNumber>=1 && sgNumber<=71) {
return "1"
}
if(sgNumber==72) {
return "1 and 2"
}
if(sgNumber>=73 && sgNumber<=125) {
return "2"
}
if(sgNumber==126) {
return "2 and 3"
}
if(sgNumber>=127 && sgNumber<=202) {
return "3"
}
if(sgNumber>=207 && sgNumber<=269) {
return "4"
}
if(sgNumber>=270 && sgNumber<=333) {
return "5"
}
if(sgNumber>=334 && sgNumber<=433) {
return "6"
}
if(sgNumber>=434 && sgNumber<=497) {
return "7"
}
if(sgNumber>=498 && sgNumber<=560) {
return "8"
}
if(sgNumber>=561 && sgNumber<=627) {
return "9"
}
if(sgNumber>=628 && sgNumber<=691) {
return "10"
}
if(sgNumber>=692 && sgNumber<=791) {
return "11"
}
if(sgNumber>=792 && sgNumber<=872) {
return "12"
}
if(sgNumber>=874 && sgNumber<=955) {
return "13"
}
if(sgNumber>=956 && sgNumber<=1019) {
return "14"
}
else {
return "Error: No box location!"
}
Utilities.sleep(500)
}
Vous n’avez peut-être pas besoin d’un script pour cela en tant que formule du type:
=iferror(vlookup(U1,D$1:E$20,2),"Error: No box location!")
copié pour convenir peut servir où D1: E20 est une table du genre:
Cela pourrait être dans la même feuille mais il semble judicieux de conserver ces données de "référence" dans une feuille séparée (auquel cas la formule ci-dessus nécessiterait l'ajout d'une référence à la feuille).
Si le double-clic fonctionne pour réduire la vitesse, la vitesse est à peu près la même que pour une fonction définie par l'utilisateur et peut même être plus rapide, même si cela ne devrait pas prendre plus d'environ 10 secondes pour 2000 lignes.
J'allais le faire comme ça.
function myValues(range) {
var output = [];
for(var i = 0, iLen = range.length; i < iLen; i++) {
output.Push(checkValue(range[i][0]));
}
return output;
}
function checkValue(value) {
var check;
if(value >= 1 && value <= 71) {
check = 1;
} else if (value == 72) {
check = '1 and 2';
} else if (value >= 73 && value <= 125) {
check = 2;
} else if (value == 126) {
check = '2 and 3';
} else {
check = 'Error: No box location!';
}
return check.toString();
}
Assurez-vous d'ajouter le reste des critères vous-même !!
J'ai créé un exemple de fichier pour vous: code invoqué trop souvent
Centre d'aide de Google dit :
Le script a été invoqué trop souvent par seconde pour ce compte d'utilisateur Google. Cela indique que le script a commencé à s'exécuter trop souvent sur une courte période. Cela se produit généralement pour les fonctions personnalisées appelées de manière répétée dans une seule feuille de calcul. Pour éviter cette erreur, codez vos fonctions personnalisées de manière à ce qu'elles ne soient appelées qu'une seule fois , par plage de données , comme expliqué dans le guide des fonctions personnalisées.
Je suppose que c'est parce qu'appeler une fonction personnalisée nécessite beaucoup de mémoire (passer en revue les fonctions existantes [éventuellement sur les serveurs de Google] pour voir si elle est présente, puis revenir en arrière pour l'exécuter). Vous devez faire en sorte qu'il ne soit appelé qu'une fois au lieu de 2000 fois. Le fait que vous ayez ajouté sleep()
ne fait rien car il est inaccessible (vous êtes toujours return
avant d'arriver à cette déclaration), mais même si ce n'était pas le cas, cela ne ferait qu'aggraver les choses ne dormez pas entre les invocations, mais plutôt après chaque invocation .
Votre code est un peu drôle, et la clause else
à la fin m'a particulièrement amusée. Je ne pouvais pas trouver de modèle pour vos gammes, alors je viens de stocker toutes les limites supérieures et leurs sorties respectives dans deux tableaux. De plus, pour que le code ne soit appelé qu'une seule fois, je l'ai fait de sorte que vous deviez choisir la plage que vous voulez et qu'il renvoie un tableau (chaque élément est sorti sur une ligne différente). Vérifiez-le:
function assignBoxNumber(range){
var maxes = [1, 72, 73, 126, 127, 203, 207, 270, 334, 434, 498, 561, 628, 692, 792, 873, 874, 956, 1020];
var vals = ["", "1", "1 and 2", "2", "2 and 3", "3", "", "4", "5", "6", "7", "8", "9", "10", "11", "12", "", "13", "14"];
//if (maxes.length != vals.length) {return "you fucked up"; }
var length = range.length, output = new Array(length);
var i, obj, key;
for (var row = 0; row < length; row++)
{
obj = range[row][0];
key = "";
for (i = 0; i < maxes.length; i++)
{
if (obj < maxes[i]){ key = vals[i]; break;}
}
output[row] = (key == "") ? "Error: No box location!" : key;
}
return output;
};
Notez que le paramètre est une plage . Cela signifie que ce sera au format <cell1>:<cell2>
, U1:U20
par exemple, mais il s’agit ET NON d’une chaîne. Le premier nombre est la première cellule (dans l'exemple U1
), le second est la dernière cellule (U20
). Vous pouvez également sélectionner la région que vous souhaitez utiliser pour obtenir la plage:
Mais évidemment, pour 2k + lignes, vous voulez l'écrire. Appelez donc la fonction comme =assignBoxNumber(<first cell>:<last cell>)
.
Je l'ai testé sur 1 021 lignes et cela a parfaitement fonctionné. Je comprends pourquoi il y avait un problème auparavant - il faut un certain temps pour trouver la fonction personnalisée. Il ne devrait pas y avoir de problème maintenant qu’il n’ya qu’un seul appel à la fonction personnalisée.
UPDATE: Correction des tableaux et maintenant la sortie est complètement identique à celle de votre méthode désordonnée .