Question

J'ai une feuille de calcul avec quelques valeurs dans la colonne G. Certaines cellules sont vides entre les deux, et je dois obtenir la dernière valeur de cette colonne dans une autre cellule.

Quelque chose comme:

=LAST(G2:G9999)

sauf que LAST est pas une fonction.

Était-ce utile?

La solution

Donc, cette solution prend une chaîne comme paramètre. Il trouve le nombre de lignes dans la feuille. Il obtient toutes les valeurs dans la colonne spécifiée. Il boucle à travers 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 fonction de mise à jour automatiquement:

La meilleure façon que je pourrais trouver est d'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 comme la section Utilisation États. vous êtes au lieu coder en dur la cellule que vous souhaitez mettre à jour et la colonne que vous souhaitez suivre. Il est possible qu'il y ait une façon plus éloquente de mettre en œuvre cette (je l'espère qui ne soit pas codé en dur), mais c'est le meilleur que je pouvais trouver pour l'instant.

Notez que si vous utilisez la fonction dans la cellule comme indiqué précédemment, il mettra à jour sur reload. Peut-être il y a un moyen de crochet dans onEdit() et la force dans les fonctions cellulaires à la mise à jour. Je ne peux pas le trouver dans la documentation.

Autres conseils

réponse de Caligari, mais nous pouvons ranger ce par tout en spécifiant la gamme complète de la colonne:

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

En fait, je trouve une solution plus simple ici:

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

Il ressemble à ceci:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))

dernière fonction () est pas mise en œuvre à l'heure actuelle en vue de sélectionner la dernière cellule dans une plage. Cependant, votre exemple:

=LAST(G2:G9999)

nous sommes en mesure d'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 exemple en direct au spreedsheet où j'ai trouvé (et résolu) le même problème (feuille Orzamentos, I5 cellulaire). Notez que cela fonctionne parfaitement, même à d'autres feuilles se référant dans le document.

Résumé:

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

Détails:

Je l'ai regardé à travers et a essayé plusieurs réponses, et voici ce que j'ai trouvé: La solution la plus simple (voir Dohmoose » réponse) fonctionne s'il n'y a pas blancs:

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

Si vous avez des blancs, il échoue.

Vous pouvez gérer un blanc en changeant juste de COUNT à COUNTA (Voir réponse de user3280071):

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

Cependant, cela ne fonctionne pas pour certaines combinaisons d'ébauches. (1 blank 1 blank 1 échoue pour moi.)

Les travaux de code suivant (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 plage donnée.

Toutefois, si COLUMNS est remplacé par COUNT me semble pour obtenir une mise en œuvre fiable, épreuve 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 l'utilisation de plus

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

Ceci est assez simple et correcte. Et vous n'avez pas à vous soucier de savoir si de compter des lignes ou des colonnes. Et des solutions de script à la différence, il met à jour automatiquement avec des modifications à la feuille de calcul.

Et si vous voulez obtenir la dernière valeur dans une ligne, il suffit de changer la plage de données:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )

Pour revenir à la dernière valeur d'une colonne de valeurs de texte, vous devez utiliser COUNTA, vous auriez besoin de cette formule:

=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 ressemble à Google Apps Script prend désormais en charge les plages comme paramètres de la 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 forum d'aide:

Je regardais les réponses précédentes et ils ont l'air comme ils travaillent trop dur. Peut-être que le soutien de script a 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];
}

J'utilise ensuite dans ma feuille de calcul:

= lastValue(E17:E999)

Dans la fonction, je reçois un tableau de valeurs avec une cellule référencée par et ce seulement itère de la fin des arrière du tableau jusqu'à ce qu'il trouve une valeur non-vide ou à court d'éléments. références de la feuille doivent être interprétés avant que les données sont transmises à la fonction. Pas assez de fantaisie pour gérer multi-dimensions, que ce soit. La question a bien demandé la dernière cellule dans une seule colonne, il semble correspondre. Il va probablement mourir si vous manquez de données aussi.

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 coder en dur.

Celui-ci fonctionne pour moi:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))

obtient la dernière valeur et poignées des 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, il fonctionne parfaitement.

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

Il fonctionne toujours que si la vraie plage est inférieure à (G2:G10000)

Est-il acceptable pour 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. Laid peut-être? mais efficace dans le fonctionnement normal d'une feuille de calcul.

=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 une pensée pour une série de questions dans la zone de script qui pourraient être fournis de manière fiable avec des formules de tableau qui ont l'avantage de travailler souvent dans similaires mode dans Excel et openoffice.

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());

Je jouais avec le code donné par @tinfini, et je pensais que les gens pourraient bénéficier de ce que je pense est un peu plus élégante solution (note que je ne pense pas que les scripts ont travaillé tout à fait de la même façon 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)

En ce qui concerne @ commentaire de Jon_Schneider, si la colonne a des cellules vides utiliser simplement COUNTA ()

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

trouvé une légère variation qui a travaillé pour éliminer les blancs à partir du bas de la table. = Index (G2: G, COUNTIF (G2: G, "<>"))

Je suis surpris personne ne l'avait jamais donné cette réponse avant. 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 / faux (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 faire, comme d'autres pourraient l'avez mentionné, est:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Trouver le MAX ROWimum de la rangée non vierge et l'introduire dans INDEX

Dans un tableau d'interruption de vide zéro, en utilisant la notation INDIRECT de RC avec COUNTBLANK est une autre option. Si V4: V6 est occupé avec des entrées, puis,

V18 :

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

donnera la position du V6.

pour obtenir la dernière valeur d'une colonne, vous pouvez également utiliser la fonction MAX avec fonction IF

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top