Réponses:
Cette solution prend donc une chaîne comme paramètre. Il recherche le nombre de lignes de la feuille. Il obtient toutes les valeurs de la colonne spécifiée. Il parcourt les valeurs de la fin au début jusqu'à ce qu'il trouve une valeur qui n'est pas une chaîne vide. Enfin, il renvoie la valeur.
Scénario:
function lastValue(column) {
var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();
for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
return values[lastRow - 1];
}
Usage:
=lastValue("G")
ÉDITER:
En réponse au commentaire demandant la mise à jour automatique de la fonction:
La meilleure façon que j'ai pu trouver est d'utiliser ceci avec le code ci-dessus:
function onEdit(event) {
SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}
Il ne serait plus nécessaire d'utiliser la fonction dans une cellule comme les états de la section Utilisation . Au lieu de cela, vous codez en dur la cellule que vous souhaitez mettre à jour et la colonne que vous souhaitez suivre. Il est possible qu'il existe une manière plus éloquente de l'implémenter (j'espère qu'elle n'est pas codée en dur), mais c'est la meilleure que je puisse trouver pour le moment.
Notez que si vous utilisez la fonction dans la cellule comme indiqué précédemment, elle sera mise à jour lors du rechargement. Il existe peut-être un moyen de se connecter onEdit()
et de forcer les fonctions de cellule à se mettre à jour. Je ne peux tout simplement pas le trouver dans la documentation.
Réponse similaire à la réponse de caligari , mais nous pouvons la ranger en spécifiant simplement la plage de colonnes complète:
=INDEX(G2:G, COUNT(G2:G))
FILTER()
plage ed, similaire à la réponse de @ Geta .
COUNT(G2:G)
renvoie 0. À la place, utilisez COUNTA(G2:G)
qui ne compte que le nombre de valeurs dans un ensemble de données. COUNTA
n'est utile qu'en combinaison avec INDEX
pour obtenir la dernière valeur s'il n'y a pas un seul espace entre vos valeurs.
COUNTA
. COUNT
ne compte que les valeurs numériques: il renverra 0 lorsqu'il est donné par exemple des cellules de texte.
En fait, j'ai trouvé une solution plus simple ici:
http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=fr
Cela ressemble à ceci:
=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
ROW
renvoie le numéro de ligne, donc FILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
renvoie un tableau de tous les numéros de ligne non vides (pas leurs valeurs), par exemple [1,2, 3, 7, 12, 14]. Puis MAX
nous donne le dernier numéro de ligne. Une seconde FILTER
est ensuite appliquée pour filtrer toutes les lignes dont le numéro de ligne ne correspond pas à la valeur de MAX
(c'est-à-dire la valeur de la dernière ligne non vide).
La fonction LAST () n'est pas implémentée pour le moment afin de sélectionner la dernière cellule dans une plage. Cependant, en suivant votre exemple:
=LAST(G2:G9999)
nous pouvons obtenir la dernière cellule en utilisant le couple de fonctions INDEX () et COUNT () de cette manière:
=INDEX(G2:G; COUNT(G2:G))
Il y a un exemple en direct sur le spreedsheet où j'ai trouvé (et résolu) le même problème (feuille Orzamentos
, cellule I5
). Notez que cela fonctionne parfaitement même en se référant à d'autres feuilles dans le document.
COUNTA
dans ce cas si vous êtes sûr qu'il n'y a pas un seul espace entre les valeurs de la colonne. Voir mes commentaires pour la réponse de dohmoose.
:G
désigne le dernier élément? Est-ce documenté?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
J'ai regardé et essayé plusieurs réponses, et voici ce que j'ai trouvé: La solution la plus simple (voir la réponse de Dohmoose ) fonctionne s'il n'y a pas de blancs:
=INDEX(G2:G; COUNT(G2:G))
Si vous avez des blancs, cela échoue.
Vous pouvez gérer un blanc en passant simplement de COUNT
à COUNTA
(voir la réponse de user3280071 ):
=INDEX(G2:G; COUNTA(G2:G))
Cependant, cela échouera pour certaines combinaisons de blancs. ( 1 blank 1 blank 1
échoue pour moi.)
Le code suivant fonctionne (voir la réponse de Nader et le commentaire de jason ):
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
mais il faut se demander si vous voulez utiliser COLUMNS
ou ROWS
pour une plage donnée.
Cependant, si COLUMNS
est remplacé par, COUNT
je semble obtenir une implémentation fiable et à l'épreuve des blancs de LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Et comme COUNTA
le filtre est intégré, nous pouvons simplifier davantage l'utilisation
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
C'est un peu simple et correct. Et vous n'avez pas à vous soucier de savoir s'il faut compter les lignes ou les colonnes. Et contrairement aux solutions de script, il se met automatiquement à jour avec les modifications apportées à la feuille de calcul.
Et si vous souhaitez obtenir la dernière valeur d'une ligne, modifiez simplement la plage de données:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Pour renvoyer la dernière valeur d'une colonne de valeurs de texte, vous devez utiliser COUNTA, vous aurez donc besoin de cette formule:
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
combiné avec INDEX
ne renverra pas la dernière valeur de la colonne.
essaye ça:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Supposons que la colonne dans laquelle vous recherchez la dernière valeur soit B.
Et oui, cela fonctionne avec des blancs.
Il semble que Google Apps Script prend désormais en charge les plages en tant que paramètres de fonction. Cette solution accepte une gamme:
// Returns row number with the last non-blank value in a column, or the first row
// number if all are blank.
// Example: =rowWithLastValue(a2:a, 2)
// Arguments
// range: Spreadsheet range.
// firstRow: Row number of first row. It would be nice to pull this out of
// the range parameter, but the information is not available.
function rowWithLastValue(range, firstRow) {
// range is passed as an array of values from the indicated spreadsheet cells.
for (var i = range.length - 1; i >= 0; -- i) {
if (range[i] != "") return i + firstRow;
}
return firstRow;
}
Consultez également la discussion dans le forum d'aide Google Apps Script: Comment forcer le recalcul des formules?
J'ai regardé les réponses précédentes et elles semblent travailler trop dur. Peut-être que la prise en charge des scripts s'est simplement améliorée. Je pense que la fonction est exprimée comme ceci:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
Dans ma feuille de calcul, j'utilise ensuite:
= lastValue(E17:E999)
Dans la fonction, j'obtiens un tableau de valeurs avec une par cellule référencée et cela se répète simplement de la fin du tableau vers l'arrière jusqu'à ce qu'il trouve une valeur non vide ou soit à court d'éléments. Les références de feuille doivent être interprétées avant que les données ne soient transmises à la fonction. Pas assez sophistiqué non plus pour gérer les multi-dimensions. La question demandait la dernière cellule d'une seule colonne, elle semble donc convenir. Il mourra probablement si vous manquez de données.
Votre kilométrage peut varier, mais cela fonctionne pour moi.
Cela obtient la dernière valeur et gère les valeurs vides:
=INDEX( FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
=INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
La réponse
$ =INDEX(G2:G; COUNT(G2:G))
ne fonctionne pas correctement dans LibreOffice. Cependant, avec un petit changement, cela fonctionne parfaitement.
$ =INDEX(G2:G100000; COUNT(G2:G100000))
Cela ne fonctionne toujours que si la plage réelle est inférieure à (G2:G10000)
Est-il acceptable de répondre à la question originale avec une réponse strictement hors sujet :) Vous pouvez écrire une formule dans la feuille de calcul pour ce faire. Moche peut-être? mais efficace dans le fonctionnement normal d'un tableur.
=indirect("R"&ArrayFormula(max((G:G<>"")*row(G:G)))&"C"&7)
(G:G<>"") gives an array of true false values representing non-empty/empty cells
(G:G<>"")*row(G:G) gives an array of row numbers with zeros where cell is empty
max((G:G<>"")*row(G:G)) is the last non-empty cell in G
Ceci est proposé comme une réflexion pour une gamme de questions dans la zone de script qui pourraient être livrées de manière fiable avec des formules matricielles qui ont l'avantage de fonctionner souvent de manière similaire dans Excel et OpenOffice.
Je jouais avec le code donné par @tinfini, et je pensais que les gens pourraient bénéficier de ce que je pense être une solution légèrement plus élégante (notez que je ne pense pas que les scripts fonctionnaient tout à fait de la même manière quand il a créé la réponse originale) ...
//Note that this function assumes a single column of values, it will
//not function properly if given a multi-dimensional array (if the
//cells that are captured are not in a single row).
function LastInRange(values)
{
for (index = values.length - 1; values[index] == "" && index > 0; index--) {}
return String(values[index]);
}
En utilisation, cela ressemblerait à ceci:
=LastInRange(D2:D)
En ce qui concerne le commentaire de @ Jon_Schneider, si la colonne contient des cellules vides, utilisez simplement COUNTA ()
=INDEX(G2:G; COUNT**A**(G2:G))
J'ai trouvé un autre moyen, peut-être que cela vous aidera
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
-retournera la dernière ligne
Plus d'informations sur anab ici: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Je suis surpris que personne n'ait jamais donné cette réponse auparavant. Mais cela devrait être le plus court et cela fonctionne même dans Excel:
=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))
G2:G<>""
crée un tableau de 1 / true (1) et 1 / false (0). Depuis LOOKUP
fait une approche descendante pour trouver 2
et comme il ne trouvera jamais 2, il arrive à la dernière ligne non vide et donne la position de cela.
L'autre façon de procéder, comme d'autres l'ont peut-être mentionné, est:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Trouver le MAX
imum ROW
de la rangée non vierge et l' introduire dansINDEX
Dans un tableau à zéro interruption vide, Utiliser la INDIRECT
RC
notation avec COUNTBLANK
est une autre option. Si V4: V6 est occupé avec des entrées, alors,
V18 :
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
donnera la position du V6.
Tools -> Scripts -> Script editor...