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

j'ai une feuille de calcul avec quelques valeurs dans la colonne G. certaines cellules sont vides entre les deux, et j'ai besoin d'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.

101
demandé sur pnuts 2010-11-13 02:21:48

21 réponses

ainsi Cette solution prend une chaîne comme paramètre. Il trouve combien de lignes sont dans la feuille. Il obtient toutes les valeurs dans la colonne spécifiée. Il boucle 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 retunrs 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];
}

Utilisation:

=lastValue("G")

EDIT:

en réponse au commentaire demandant la mise à jour automatique de la fonction:

la meilleure façon que j'ai pu trouver est de l'utiliser avec le code ci-dessus:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

Il n'est plus nécessaire d'utiliser la fonction dans une cellule, comme la Utilisation section membres. Au lieu de cela, vous codez dur la cellule que vous souhaitez mettre à jour et la colonne que vous souhaitez suivre. Il est possible qu'il y est une une façon plus éloquente de mettre en œuvre ceci (avec un peu de chance ce n'est pas un code dur), mais c'est le meilleur que j'ai pu trouver pour le moment.

notez que si vous utilisez la fonction dans la cellule comme indiqué plus haut, elle sera mise à jour lors du rechargement. Peut-être qu'il y a un moyen de s'accrocher à onEdit() et forcer les fonctions de la cellule à mettre à jour. Je ne peux pas le trouver dans la documentation.

50
répondu tinifni 2010-11-18 21:57:59

réponse similaire à réponse de caligari , mais nous pouvons la ranger en précisant simplement la gamme complète de la colonne:

=INDEX(G2:G, COUNT(G2:G))
156
répondu dohmoose 2018-03-05 17:00:33

en fait j'ai trouvé une solution plus simple ici:

http://www.google.com/support/forum/p/Google+Docs / thread?tid=20f1741a2e663bca&hl = en

il ressemble à ceci:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
52
répondu Getas 2014-03-23 18:23:42

fonction LAST() n'est pas mis en œuvre à l'heure actuelle 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 façon:

=INDEX(G2:G; COUNT(G2:G))

il y a un live example au spreedsheet où j'ai trouvé (et résolu) le même problème (feuille Orzamentos , case I5 ). Notez qu'il fonctionne parfaitement, même en référence à d'autres feuilles dans le document.

41
répondu caligari 2018-03-05 17:02:49

résumé:

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

détails:

j'ai cherché 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, il échoue.

vous pouvez gérer un vide en changeant simplement de COUNT à COUNTA (voir user3280071 réponse ):

=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 penser à savoir si vous voulez utiliser COLUMNS ou ROWS pour une gamme donnée.

toutefois, si COLUMNS est remplacé par COUNT je semble obtenir une mise en œuvre fiable et à l'épreuve de LAST :

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

et depuis 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 quelque chose de simple, et de les corriger. Et vous n'avez pas à vous soucier de savoir si pour compter les lignes ou les colonnes. Et à la différence des solutions de script, il met automatiquement à jour avec des changements à la feuille de calcul.

et si vous voulez obtenir la dernière valeur dans une rangée, il suffit de changer la gamme de données:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
23
répondu Doug Bradshaw 2018-03-05 17:07:19

pour retourner la dernière valeur d'une colonne de valeurs de texte, vous devez utiliser COUNTA, donc vous aurez besoin de cette formule:

=INDEX(G2:G; COUNTA(G2:G))
7
répondu user3280071 2014-02-06 14:52:29

essayez ceci: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

supposons que la colonne dans laquelle vous cherchez la dernière valeur est B.

et oui, ça marche avec des blancs.

6
répondu Andrew Anderson 2015-09-21 21:17:06

il semble que le Script Googleapps supporte désormais les gammes comme 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;
}

Voir aussi la discussion dans Google Apps Script help forum: comment forcer les formules à recalculer?

5
répondu craig3353 2011-11-27 01:42:18

j'ai regardé les réponses précédentes et ils semblent travailler trop dur. Peut-être que le support des scripts s'est simplement amélioré. 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 alors:

= lastValue(E17:E999)

dans la fonction, j'obtiens un tableau de valeurs avec une par cellule référencée et cela itère juste à partir de la fin du tableau à l'envers jusqu'à ce qu'il trouve une valeur non vide ou à court d'éléments. Feuille les références doivent être interprétées avant que les données est transmis à la fonction. Pas assez fantaisiste pour gérer le multi-dimensions, non plus. La question demandait la dernière cellule d'une seule colonne, donc elle semble convenir. Il s'éteindra probablement si vous n'avez plus de données.

Votre kilométrage peut varier, mais cela fonctionne pour moi.

5
répondu Ted H. 2014-02-19 04:04:15

celui-ci travaille pour moi:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
4
répondu Pedro 2015-01-31 15:40:24

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

=+sort(G:G,row(G:G)*(G:G<>""),)
4
répondu JPV 2015-11-20 14:32:27

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)) ) ) )
4
répondu Nader 2018-03-05 17:08:04
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

pas de codage.

3
répondu desnyki 2012-06-15 11:08:21

la réponse

$ =INDEX(G2:G; COUNT(G2:G))

ne fonctionne pas correctement à LibreOffice. Cependant, avec un petit changement, il fonctionne parfaitement.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

il ne fonctionne toujours que si la vraie gamme est plus petite que (G2:G10000)

3
répondu Manuel Ferreira 2015-12-30 21:06:22

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 à faire. Laid 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 offert comme une pensée pour une gamme de questions dans la zone de script qui pourrait être livré de manière fiable avec des formules de tableau qui ont l'avantage de travailler souvent dans similaire mode excel et openoffice.

2
répondu DavidF 2012-08-09 05:09:20
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());
2
répondu Marian 2015-12-13 20:34:34

je jouais avec le code donné par @tinfini, et j'ai pensé que les gens pourraient bénéficier de ce que je pense être une solution un peu plus élégante (notez que je ne pense pas que les scripts ont fonctionné 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]);
}

dans l'usage il ressemblerait à ceci:

=LastInRange(D2:D)
2
répondu Jonathan Cavell 2017-01-12 23:29:27

en ce qui concerne le commentaire de @Jon_Schneider, si la colonne contient des cases vides, utilisez simplement COUNTA ()

=INDEX(G2:G; COUNT**A**(G2:G))
1
répondu pedro 2013-10-08 12:27:03

je suis surpris que personne n'ait jamais donné cette réponse auparavant. Mais cela devrait être le plus court et il 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). Puisque LOOKUP fait une approche descendante pour trouver 2 et Puisqu'il ne trouvera jamais 2,il monte à la dernière rangée non vide et donne la position de cela.

L'autre façon de faire, comme d'autres peuvent l'ai 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'alimenter en INDEX

dans un tableau d'interruption à blanc, en utilisant INDIRECT RC notation avec COUNTBLANK est une autre option. Si V4: V6 est occupé par des entrées, alors,

V18 :

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

donnera la position de V6.

1
répondu I'-'I 2018-03-05 17:09:13

j'ai trouvé une autre façon peut-être cela peut vous aider à

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) - retournera la dernière ligne

plus d'informations de anab ici: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents / if0_fGVINmI

1
répondu irriss 2018-03-05 17:09:42

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

1
répondu Chris 2018-07-20 16:12:28