Je veux créer une fonction qui prend dans une plage ... quelque chose comme:
function myFunction(range) {
var firstColumn = range.getColumn();
// loop over the range
}
Une cellule le référencerait en utilisant:
=myFunction(A1:A4)
Le problème est que, lorsque j'essaie de le faire, le paramètre semble ne transmettre que les valeurs à la fonction. Ainsi, je ne peux utiliser aucune des méthodes Range telles que getColumn()
. Lorsque j'essaie de le faire, cela donne l'erreur suivante:
error: TypeError: Impossible de trouver la fonction getColumn dans l'objet 1,2,3.
Comment puis-je envoyer une plage réelle plutôt que simplement les valeurs à l'une de mes fonctions personnalisées?
range
est traité comme le tableau 2d de javascript. Vous pouvez obtenir le nombre de lignes avecrange.length
et le nombre de colonnes avecrange[0].length
. Si vous souhaitez obtenir la valeur de la ligner
et la colonnec
utilisation:range[r][c]
.la source
=myFunction(C1:F1)
la fonctionrange[0][0]
retournera la valeur deC1
,range[0][1]
retournera la valeur deD1
,range[0][2]
retournera la valeur deE1
, etc. Est-ce clair?=weightedAverage(B3:D3,$B$2:$D$2)
, je voudrais rendre la fonction plus résistante aux erreurs en évitant d'envoyer le deuxième argument (c.-à-d. Je veux l'appeler ainsi=weightedAverage(B3:D3)
), puis que le code sache automatiquement que la plage commence à B et se termine à D, il obtient donc les valeurs correspondantes de la 2e ligne. Remarque: la valeur "2" peut être codée en dur, mais "B" ne devrait pas l'être.B
parti d'une donnéerange
. Je vous conseillerais de consulter le guide de démarrage ( goo.gl/hm0xT ), si vous ne l’avez pas déjà fait, pour avoir une idée de la façon dont vous pouvez jouer avec des plages et des cellules.Lorsque vous transmettez une
Range
fonction de feuille de calcul à Google, la structure s'exécute deparamRange.getValues()
manière implicite et votre fonction reçoit les valeurs de la plage sous forme de tableau à 2 dimensions de chaînes, de nombres ou d'objets (similairesDate
). L'Range
objet n'est pas transmis à votre fonction de feuille de calcul personnalisée.La
TYPEOF()
fonction ci-dessous vous indiquera quel type de données vous recevez comme paramètre. La formule=TYPEOF(A1:A4)
appellera le script comme ceci:
la source
En guise d' alternative, inspirée du commentaire de @Lipis, vous pouvez appeler votre fonction avec les coordonnées de ligne / colonne comme paramètres supplémentaires:
Sous cette forme, la formule peut facilement être copiée (ou glissée) dans d'autres cellules et les références de cellule / plage seront automatiquement ajustées.
Votre fonction de script doit être mise à jour en tant que telle:
Notez que la
getRange
fonction prendstartRow
,startColumn
et puis nombre de lignes et nombre de colonnes - pas fin ligne et fin colonne. Ainsi, l'arithmétique.la source
Cela peut être fait . Vous pouvez obtenir une référence à la plage passée en analysant la formule dans la cellule active, qui est la cellule contenant la formule. Cela laisse supposer que la fonction personnalisée est utilisée seule et non comme une partie d'une expression plus complexe: par exemple
=myfunction(A1:C3)
, pas=sqrt(4+myfunction(A1:C3))
.Cette fonction renvoie le premier index de colonne de la plage transmise.
la source
J'ai étendu l'excellente idée de la réponse de user79865 , de la faire fonctionner pour plus de cas et avec plusieurs arguments passés à la fonction personnalisée.
Pour l'utiliser, copiez le code ci-dessous, puis dans votre appel de fonction personnalisé
GetParamRanges()
, transmettez-lui votre nom de fonction:Voici un exemple pour renvoyer la couleur d'une cellule:
Voici le code et quelques explications supplémentaires:
la source
Je distingue deux fonctions personnalisées différentes dans Google Spreadsheet, via le script Google Apps:
La première fonction est capable de faire presque n'importe quoi. En plus d'appeler le service Tableur, il peut faire appel à GmailApp ou à tout service mis à disposition par Google. Les appels d'API ralentiront le processus. Une plage peut être transmise ou récupérée via la fonction pour accéder à toute la méthode disponible.
La deuxième fonction est limitée à la "feuille de calcul" uniquement. Ici, on peut utiliser JavaScript pour retravailler les données. Ces fonctions sont normalement très rapides. Une plage passée n'est rien d'autre qu'un tableau 2D contenant des valeurs.
Dans votre question, vous commencez par appeler la
.getColumn()
méthode. Cela indique clairement que vous avez besoin d'une fonction personnalisée de type 1, comme décrit ci-dessus.Voir la réponse suivante sur la définition de la feuille de calcul et de la feuille pour créer une fonction personnalisée.
la source
Je travaillais là-dessus il y a quelques mois et je suis arrivé à un kludge très simple: créez une nouvelle feuille avec le nom de chaque cellule comme contenu: la cellule A1 pourrait ressembler à:
Nommez la feuille "Ref". Ensuite, lorsque vous avez besoin d'une référence à une cellule sous forme de chaîne au lieu de son contenu, vous utilisez:
Bien sûr, vous devrez vérifier si la fonction reçoit une chaîne (une cellule) ou un tableau 1D ou 2D. Si vous obtenez un tableau, il aura toutes les adresses de cellules sous forme de chaînes, mais à partir de la première cellule et de la largeur et de la hauteur, vous pourrez déterminer ce dont vous avez besoin.
la source
J'ai travaillé dessus toute la matinée et j'ai vu des preuves de ce que les non-réponses ci-dessus discutent. Senseful et je veux tous les deux l’ADRESSE de la cellule transmise, pas la valeur. Et la réponse est très facile. Cela ne peut pas être fait.
J'ai trouvé des solutions de contournement qui consistent à déterminer quelle cellule contient la formule. Il est difficile de dire si cela aurait aidé Senseful ci-dessus. Alors qu'est-ce que je faisais?
La colonne H est celle de Sophia (Victoires - PrevWins) / (Pertes - PrevLosses)
(7 - 4) / (4 - 2) = 1,5
Mais nous ne savons pas dans quelle ligne Sophia était précédemment apparue.
Tout peut être fait en utilisant VLOOKUP si vous codez en dur A comme colonne de nom. Après VLOOKUP, je récupérais des caractères #NA (nom introuvable) et # DIV0 (dénominateur zéro) et je les enveloppais avec = IF (IF (...)) pour afficher un texte plus agréable dans ces conditions. J'avais maintenant une expression monstrueusement grande qui était difficile à manier et à maintenir. Je voulais donc une expansion des macros (n'existe pas) ou des fonctions personnalisées.
Mais quand j'ai créé un assistant SubtractPrevValue (cellule), il recevait "7" au lieu de B5. Il n'y a pas de moyen intégré pour obtenir des objets de cellule ou de plage à partir des arguments transmis.
Si je fais entrer manuellement le nom de la cellule entre guillemets, je peux le faire ... SubtractPrevValue ("B5"). Mais ce sont vraiment les ischio-jambiers copier / coller et les caractéristiques relatives des cellules.
Mais ensuite j'ai trouvé une solution de contournement.
SpreadsheetApp.getActiveRange () EST LA CELLULE qui contient la formule. C'est tout ce que j'avais vraiment besoin de savoir. Le numéro de la ligne. La fonction suivante prend un numéro de colonne NUMERIC et soustrait l'occurrence précédente de cette colonne.
Mais ensuite, j'ai découvert que c'était vraiment TRÈS lent. Un délai de une et deux secondes s’affiche alors que le message "Thinking" (Penser ...) me ramène à la formule de feuille de calcul massivement illisible et impossible à maintenir.
la source
Au lieu de fournir l'objet "Range", les développeurs de Google transmettent un type de données aléatoire. J'ai donc développé la macro suivante pour imprimer la valeur de l'entrée.
la source
Voici ma compilation des réponses précédentes
Il prend la formule actuelle et vérifie s'il s'agit d'une plage.
=GFR(A1:A5;1;C1:C2;D1&D2)
résultatsPour la composition complète, le TC peut appeler quelque chose comme ceci
la source
Créer une fonction et passer la plage en argument:
Utilisation dans un tableur:
Il montrera la valeur comme
sum(A1:A10)
.la source