J'ai une feuille de calcul avec des valeurs dans la colonne G. Certaines cellules sont vides entre elles et je dois obtenir la dernière valeur de cette colonne dans une autre cellule.
Quelque chose comme:
=LAST(G2:G9999)
sauf que LAST
n'est pas une fonction.
Donc, cette solution prend une chaîne en tant que paramètre. Il trouve combien de lignes sont dans 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 retourne la valeur.
Script:
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];
}
tilisation:
=lastValue("G")
EDIT:
En réponse au commentaire demandant à la fonction de se mettre à jour automatiquement:
Le meilleur moyen que je puisse trouver est de l'utiliser 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 telle que la section sage. 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 un moyen plus éloquent de mettre en œuvre ceci (espérons-le, celui qui n'est pas codé en dur), mais c'est le meilleur que j'ai pu trouver pour l'instant.
Notez que si vous utilisez la fonction dans la cellule comme indiqué précédemment, elle sera mise à jour lors du rechargement. Peut-être existe-t-il un moyen de se connecter à onEdit()
et de forcer la mise à jour des fonctions de cellule. Je ne peux tout simplement pas le trouver dans la documentation.
Réponse similaire à réponse de caligari , mais nous pouvons la nettoyer en spécifiant simplement la plage complète de la colonne:
=INDEX(G2:G, COUNT(G2:G))
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)))))
La fonction LAST () n'est pas encore implémentée pour sélectionner la dernière cellule d'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 réel sur la feuille de calcul où j'ai trouvé (et résolu) le même problème (feuille Orzamentos
, cellule I5
). Notez que cela fonctionne parfaitement, même en faisant référence à d'autres feuilles du document.
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
J'ai parcouru et essayé plusieurs réponses et voici ce que j'ai trouvé: La solution la plus simple (voir 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 remplaçant simplement COUNT
par COUNTA
(voir 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 réponse de Nader et 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.
Toutefois, si COLUMNS
est remplacé par COUNT
, il semble que je reçoive une implémentation fiable et vierge de LAST
:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )
Et puisque COUNTA
a le filtre intégré, nous pouvons simplifier davantage en utilisant
=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 est automatiquement mis à jour avec les modifications apportées à la feuille de calcul.
Et si vous voulez obtenir la dernière valeur d'une ligne, changez simplement la plage de données:
=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
Afin de renvoyer la dernière valeur d'une colonne de valeurs de texte, vous devez utiliser COUNTA. Cette formule est la suivante:
=INDEX(G2:G; COUNTA(G2:G))
essayez ceci: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
Supposons que la colonne dans laquelle vous recherchez la dernière valeur est B.
Et oui, cela fonctionne avec des blancs.
Il semble que Google Apps Script prenne 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 sur le forum d'aide Google Apps Script: Comment forcer le recalcul des formules?
J'ai regardé les réponses précédentes et elles ont l'air de 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 mon tableur, j'utilise ensuite:
= lastValue(E17:E999)
Dans la fonction, j'obtiens un tableau de valeurs avec une cellule par cellule référencée, qui effectue une itération à partir de la fin du tableau jusqu'à ce qu'il trouve une valeur non vide ou manque 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é pour gérer plusieurs dimensions, non plus. La question demandait la dernière cellule d'une seule colonne, donc cela semble correspondre. Cela mourra probablement aussi si vous manquez de données.
Votre kilométrage peut varier, mais cela fonctionne pour moi.
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
pas de codage dur.
Celui-ci fonctionne pour moi:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Ceci 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)) ) ) )
Dans une colonne avec des blancs, vous pouvez obtenir la dernière valeur avec
=+sort(G:G,row(G:G)*(G:G<>""),)
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 vraie plage est inférieure à (G2:G10000)
Est-il acceptable de répondre à la question initiale avec une réponse strictement hors sujet :) Vous pouvez écrire une formule dans la feuille de calcul pour le 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 pensée pour une série de questions dans la zone de script qui pourraient être fournies de manière fiable avec des formules de tableau qui ont l’avantage de travailler souvent de la 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 (remarque: je ne pense pas que les scripts fonctionnent 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 usage, cela ressemblerait à ceci:
=LastInRange(D2:D)
function getDashboardSheet(spreadsheet) {
var sheetName = 'Name';
return spreadsheet.getSheetByName(sheetName);
}
var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);
var dashboardSheet = getDashboardSheet(spreadsheet);
Logger.log('see:'+dashboardSheet.getLastRow());
J'ai trouvé une autre solution qui pourrait vous aider
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
retournera la dernière ligne
Plus d'infos sur anab ici: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI
Trouvé une légère variation qui a fonctionné pour éliminer les blancs du bas de la table. = index (G2: G, COUNTIF (G2: G, "<>"))
Concernant le commentaire de @ Jon_Schneider, si la colonne a des cellules vides, utilisez simplement COUNTA ()
=INDEX(G2:G; COUNT**A**(G2:G))
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/vrai (1) et 1/faux (0). Puisque LOOKUP
fait une approche descendante pour trouver 2
et comme il ne trouvera jamais 2, il se place à la dernière ligne non vide et en donne la position.
L'autre façon de faire, comme d'autres l'ont peut-être mentionné, est la suivante:
=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)
Trouver le MAX
imum ROW
de la ligne non vide et l'envoyer à INDEX
Une autre option consiste à utiliser la notation INDIRECT
RC
avec COUNTBLANK
dans un tableau d'interruption vierge. Si V4: V6 est occupé avec des entrées, alors,
V18:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
donnera la position de V6.
pour obtenir la dernière valeur d'une colonne, vous pouvez également utiliser la fonction MAX
avec la fonction IF
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))