Script pour résumer les données non mises à jour
J'ai une feuille de calcul Google des données de feuille de temps; il a une feuille pour chaque mois, chaque feuille est un lot de six colonne de blocs, un bloc par client.
J'ai créé une fiche de synthèse qui se passe et obtient le total de chaque clients et les affiche dans une liste:
function getClientTotals(sheetname, colcount)
{
colcount = colcount ? colcount : 6;
var res;
var ss = SpreadsheetApp.openById('myid_goes_here');
if(ss)
{
res = [];
var totrow = ss.getRange(sheetname + '!A1:ZZ1').getValues()[0];
for(var i = 0; i < totrow.length; i += colcount)
{
res.push([totrow[i], totrow[i + colcount - 1]]);
}
}
return res;
}
J'ai ensuite ajouté une cellule de ma feuille récapitulative contenant =getClientTotals($C$7,$C$8)
qui passe dans le nom de la feuille pour le mois et le nombre de colonnes pour chaque client (dans le cas de "schéma" des modifications.
Tout cela fonctionne très bien, cependant, il ne met pas à jour lorsque les données source est modifié. J'ai ajouté une onEdit
déclencheur; pas de joie. Il met à jour si vous allez dans l'éditeur de script et cliquez sur Enregistrer, mais ce n'est pas utile. Ai-je raté quelque chose?
source d'informationauteur Whelkaholism
Vous devez vous connecter pour publier un commentaire.
Il vous manque la minutieuse mise en cache
bugfonctionnalité. Il fonctionne de cette façon:Google considère que toutes les fonctions dépendent seulement sur leurs paramètres directement les valeurs de retour de leur résultat (vous pouvez éventuellement dépendre d'autres données statiques).
Compte tenu de cette condition, ils peuvent évaluer votre ne fonctionne que lorsqu'un paramètre change. par exemple,
Supposons que nous avons le texte "10" sur la cellule B1, puis sur une autre cellule de type
=myFunction(B1)
myFunction sera évaluée et son résultat récupéré. Alors si vous modifiez la cellule B1 la valeur "35", personnalisé sera ré-évalué comme prévu et le nouveau résultat récupéré normalement.
Maintenant, si vous modifiez la cellule B1 de nouveau à l'original "10", il n'y a pas de réévaluation, le résultat initial est récupéré immédiatement à partir du cache.
Donc, lorsque vous utilisez le nom de la feuille en tant que paramètre pour la récupérer dynamiquement et de retourner le résultat, vous êtes à la rupture de la règle de mise en cache.
Malheureusement, vous ne pouvez pas avoir les fonctions personnalisées sans cette caractéristique étonnante. Donc vous devrez soit changer de recevoir directement les valeurs, au lieu de le nom de la feuille, ou de ne pas utiliser une fonction personnalisée. Par exemple, vous pourriez avoir un paramètre sur votre script indiquant où les résumés doivent aller et avoir un
onEdit
les mettre à jour à chaque fois qu'un changement total.une autre solution pour le problème de mise en cache.
avoir une variable muette dans votre méthode.
passer
que la valeur de ce paramètre.
par exemple
la sortie du filtre n'est pas utilisé. cependant, il indique à la feuille de calcul que cette formule est sensible à B4:Z10 gamme.
J'ai eu un problème similaire, avec la création d'un tableau de bord pour le travail. Chamil la solution ci-dessus (à savoir à l'aide de la Fiche de fonction de Filtre passé comme valeur à une variable fictive dans votre fonction) fonctionne très bien, en dépit de la plus récente du commentaire d'Arsen. Dans mon cas, j'ai été en utilisant une fonction de suivi d'une gamme et ne pouvait pas utiliser le filtre sur la même gamme car il créé une référence circulaire. Donc j'ai juste eu une cellule (dans mon cas E45 dans le code ci-dessous) dans laquelle j'ai changé le nombre à chaque fois que je voulais que ma fonction de mise à jour:
Que Chamil indiqué, le filtre n'est pas utilisé dans le script:
Ce que vous pourriez faire est de mettre en place une cellule quelque part dans la feuille de calcul qui sera mis à jour chaque fois qu'une nouvelle feuille est ajoutée. Assurez-vous de ne pas mettre à jour à chaque modification, mais seulement lorsque vous voulez faire le calcul (dans votre cas lorsque vous ajoutez une feuille). Vous passez ensuite la référence à cette cellule de votre fonction personnalisée. Comme mentionné la fonction personnalisée pouvez ignorer ce paramètre.
Étant donné que la fonctionnalité expliqué par Henrique Abreu, vous pouvez essayer les out-of-box fonction de feuille de calcul REQUÊTE , SQL aimé requête est ce que j'utilise souvent dans le travail
sur les données brutes, et d'obtenir les données en tant que résumé à un autre onglet, le résultat de données est mise à jour en temps réel à la suite d'un changement dans les données brutes.
Ma suggestion est basée sur le fait que votre script n'a pas avancé des travaux tels que l'URL de fetch, juste des données de travail, sans données réelles lire, je ne peux pas donner une solution précise à l'aide de REQUÊTES.
Concernant la fonctionnalité de cache mentionné par Henrique Abreu (je n'ai pas assez de réputation pour un commentaire directement, en vertu de sa réponse), j'ai fait des tests et constaté que:
regarde il n'y a pas de cache de travail, la fonction de test du script ci-dessous:
fonction additionneur(de base) {
Utilitaires.sleep(5000);
de retour de base + 10;
}
l'application de cette fonction personnalisée additionneur() dans la feuille par l'appel d'une cellule, puis changé que la valeur de la cellule avant et en arrière, chaque fois que je vois le message de chargement et le temps total de plus de 5 secondes.
Il pourrait être lié à la mise à jour mentionnée dans ce Problème du GAZ:
le problème mentionné dans cette rubrique reste, mes tests indiquent qu', Google feuille de recalculer fonction personnalisée chaque fois que LORSQUE
fonction getCellValue(sheetName,row,col)
{
var ss= SpreadsheetApp.getActiveSpreadsheet();
var sh = ss.getSheetByName(sheetName);
retour sh.getRange(ligne, col).getValue();
}
Un changement de toute valeur en jaune les cellules de plomb pour le calcul de la fonction personnalisée; la véritable source de données de changement de valeur est ignorée par la fonction.
Je n'ai pas envie d'avoir un paramètre fictif. YMMV sur ce.
1 Une cellule qui est une "Liste d'Objets", on est "Actualiser"
2 Script avec "onEdit', si la cellule est "Refresh":
a)Vider le cache de documents
b)Remplir doc cache avec les données externes (une table dans mon cas)
c)Pour toutes les cellules, avec mon getStockoData(...' fonction personnalisée
la formule
set '=0'
définir la fromula
d)Ensemble de la cellule (1) avec une valeur de "Prêt"
Cela ne actualiser les bits que vous voulez, MAIS n'EST PAS RAPIDE.
@Brionius dit de mettre un supplément de dinamic argument de la fonction. si vous utilisez maintenant() vous pouvez avoir des problèmes de délai d'attente de faire la mise à jour un peu plus lent...