Sélection de la dernière valeur d'une colonne

Réponses:

54

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.

tinifni
la source
5
Ceci est un script de feuille de calcul Google. Vous pouvez créer un nouveau script sousTools -> Scripts -> Script editor...
tinifni
1
: O c'est incroyable! Je ne savais pas que Google avait implémenté des scripts. Merci beaucoup, cela a parfaitement fonctionné
cambraca
1
une idée comment le faire mettre à jour automatiquement lorsque je change les données dans la feuille?
cambraca
J'ai édité ma réponse avec quelques informations qui devraient aider. Bon codage!
tinifni
5
J'ai modifié ce script afin que vous puissiez y passer des feuilles nommées comme lastValue ("Sheet1! A") gist.github.com/2701061
johnwards
165

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))
dohmoose
la source
12
Cela semble fonctionner tant qu'il n'y a pas de blancs dans l'ensemble de données
Keith Sirmons
Une autre bonne ressource est la réponse sélectionnée sur productforums.google.com/forum/#!topic/docs/p3t3feg7Jic qui montre comment obtenir la première, la dernière ou la nième ligne d'une FILTER()plage ed, similaire à la réponse de @ Geta .
Aaron Blenkush
Cette réponse stackoverflow.com/a/8161172/418111 a une formule qui prend en charge les cellules vides.
Daniel
8
Comme @KeithSirmons l'a mentionné. S'il y a des blancs dans votre colonne, cela ne fonctionne pas, car 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. COUNTAn'est utile qu'en combinaison avec INDEXpour obtenir la dernière valeur s'il n'y a pas un seul espace entre vos valeurs.
Christiaan Westerbeek
3
Notez également que si vos valeurs ne sont pas numériques, vous en aurez besoin COUNTA. COUNTne compte que les valeurs numériques: il renverra 0 lorsqu'il est donné par exemple des cellules de texte.
Air du
53

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)))))
Obtenir comme
la source
2
Wow, c'est incroyablement propre. Pouvez-vous expliquer exactement comment cela fonctionne?
cambraca
Pas vraiment: c'est juste quand la plage source est déjà triée.
caligari
5
Expliqué: ROWrenvoie 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 MAXnous donne le dernier numéro de ligne. Une seconde FILTERest 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).
jhabbott
Les deux instances de ROW peuvent être remplacées par COLUMN afin de renvoyer la dernière valeur d'une ligne particulière (au lieu de la dernière valeur d'une colonne particulière).
Jon Schneider
2
Et si je voulais juste le numéro de ligne de la dernière valeur de la colonne?
Nick5a1
44

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.

caligari
la source
1
Cela fonctionne très bien et se met à jour automatiquement à mesure que la feuille change. Merci!
TinaMarie
8
J'aime la concision de cette suggestion, mais cela ne semble pas fonctionner lorsque la plage cible comprend des cellules vides (comme mentionné dans la question originale ci-dessus), car COUNT () ne compte pas les cellules vides.
Jon Schneider
@JonSchneider, vous pouvez utiliser COUNTAdans 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.
Christiaan Westerbeek
Pourquoi :Gdésigne le dernier élément? Est-ce documenté?
flow2k
33

Résumé:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

Détails:

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 COLUMNSou ROWSpour une plage donnée.

Cependant, si COLUMNSest remplacé par, COUNTje 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 COUNTAle 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) )
Doug Bradshaw
la source
Super utile pour parcourir les étapes et les fonctionnalités + limitations de chaque itération. J'avais besoin d'obtenir la dernière valeur de chaque ligne, certaines avec plusieurs blancs. Cela a fonctionné comme un charme. Je vous remercie!
Christiaan Adams
9

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))
user3280071
la source
1
Mais seulement s'il n'y a pas un seul espace entre vos valeurs. Si tel est le cas, COUNTAcombiné avec INDEXne renverra pas la dernière valeur de la colonne.
Christiaan Westerbeek
7

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.

Andrew Anderson
la source
6

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?

craig3353
la source
6

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.

Ted H.
la source
5
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

pas de codage en dur.

desnyki
la source
5

Celui-ci fonctionne pour moi:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
Pedro
la source
Une belle solution, qui fonctionne également en présence de cellules vides.
jochen
5

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)) ) ) )
Nader
la source
fonctionne aussi pour les colonnes. Je viens de remplacer quelques choses. =INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
jason
solution générique:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason
Pour moi, c'est la «bonne» réponse. Raisonnablement compact et facile à comprendre, et fonctionne avec des blancs.
aardvarkk
4

Dans une colonne avec des blancs, vous pouvez obtenir la dernière valeur avec

=+sort(G:G,row(G:G)*(G:G<>""),)
JPV
la source
Une belle solution. Je soupçonne que la variante de @ Pedro (utilisant INDEX et MAX) peut être légèrement plus efficace que l'utilisation de SORT, cependant.
jochen
4

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)

Manuel Ferreira
la source
Ce message a été tagué "Google Spreadsheet" et "Google Apps Script", rien en rapport avec Libre Office ... vous êtes hors sujet
Serge insas
Pas très loin du sujet car le titre de la question, Sélection de la dernière valeur d'une colonne , pourrait facilement être trouvé par une pauvre âme en utilisant LibreOffice ou Numbers. Je suis un amateur de tableurs qui en sait assez pour être dangereux. Ce que je peux comprendre, c'est que Google a fait en sorte que si votre deuxième argument à une plage n'est qu'une colonne, il sélectionne le reste de la colonne afin que les gens n'aient pas à utiliser le très grand nombre de piratages que vous avez découvert.
Aaron
3

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.

DavidF
la source
3
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());
Marian
la source
3

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)
Jonathan Cavell
la source
2

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))
pedro
la source
4
Non, cela ne fonctionne pas non plus. La différence entre COUNT et COUNTA réside dans la distinction entre les nombres et le texte, qui n'est pas pertinente ici.
mhsmith
2

J'ai trouvé une légère variation qui a permis d'éliminer les blancs du bas du tableau. = index (G2: G, COUNTIF (G2: G, "<>"))

Chris
la source
1

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 LOOKUPfait une approche descendante pour trouver 2et 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 MAXimum ROWde la rangée non vierge et l' introduire dansINDEX

Dans un tableau à zéro interruption vide, Utiliser la INDIRECT RCnotation 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.

Le maître
la source
1

pour obtenir la dernière valeur d'une colonne, vous pouvez également utiliser la MAXfonction avec la IFfonction

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
joueur0
la source