web-dev-qa-db-ja.com

列の最後の値を選択する

列Gにいくつかの値を持つスプレッドシートがあります。いくつかのセルはその間に空であり、その列から最後の値を別のセルに取得する必要があります。

何かのようなもの:

=LAST(G2:G9999)

ただし、LASTは関数ではありません。

106
cambraca

そのため、このソリューションではパラメーターとして文字列を使用します。シート内の行数を検出します。指定された列のすべての値を取得します。空の文字列ではない値が見つかるまで、値を末尾から先頭までループします。最後に、値を再調整します。

スクリプト:

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];
}

使用法:

=lastValue("G")

編集:

関数が自動的に更新されるように求めるコメントへの応答:

私が見つけることができる最良の方法は、上記のコードでこれを使用することです:

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

使用法セクション状態のようなセルで関数を使用する必要はなくなりました。代わりに、更新するセルと追跡する列をハードコーディングしています。これを実装するより雄弁な方法がある可能性があります(ハードコードされていない方法が望ましい)が、これは今のところ見つけることができる最高のものです。

前述のようなセルで関数を使用する場合、リロード時に更新されることに注意してください。 onEdit()にフックして、セル関数を強制的に更新する方法があるかもしれません。私はドキュメントでそれを見つけることができません。

54
tinifni

caligari's answer と同様の答えですが、列範囲全体を指定するだけで整理できます。

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

実際、私はここでより簡単な解決策を見つけました:

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

次のようになります。

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

範囲内の最後のセルを選択するために、現時点ではLAST()関数は実装されていません。ただし、例を次に示します。

=LAST(G2:G9999)

いくつかの関数INDEX()COUNT()を使用して、この方法で最後のセルを取得できます。

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

同じ問題(シートOrzamentos、セルI5)を見つけた(そして解決した)スプリードシートに実例があります。ドキュメント内の他のシートを参照する場合でも完全に機能することに注意してください。

43
caligari

概要:

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

詳細:

私はいくつかの答えを調べてみましたが、ここに私が見つけたものがあります:最も単純な解決策( Dohmoose 'answer を参照)は空白がなければ機能します:

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

空白がある場合、失敗します。

COUNTからCOUNTAに変更するだけで1つの空白を処理できます( ser3280071's answer を参照)。

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

ただし、いくつかの空白の組み合わせではこれは失敗します。 (1 blank 1 blank 1は失敗します。)

次のコードは機能します( Naderの答え および ジェイソンのコメント を参照):

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

ただし、特定の範囲でCOLUMNSまたはROWSのどちらを使用するかを考える必要があります。

ただし、COLUMNSCOUNTに置き換えた場合、LASTの信頼できる空白のない実装が得られるようです。

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

COUNTAにはフィルターが組み込まれているため、さらに簡単に使用できます。

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

これはいくぶん単純で正しいです。また、行をカウントするか列をカウントするかを心配する必要はありません。また、スクリプトソリューションとは異なり、スプレッドシートへの変更で自動的に更新されます。

そして、行の最後の値を取得したい場合は、データ範囲を変更するだけです:

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

テキスト値の列から最後の値を返すには、COUNTAを使用する必要があるため、次の式が必要になります。

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

これを試してください:=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

最後の値を探している列がBであるとします。

そして、はい、それは空白で動作します。

7
Andrew Anderson

Google Apps Scriptは関数パラメーターとして範囲をサポートするようになりました。このソリューションは範囲を受け入れます:

// 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;
}

Google Apps Scriptヘルプフォーラムの説明もご覧ください。 数式を強制的に再計算するにはどうすればよいですか?

6
craig3353

以前の回答を見て、彼らは一生懸命働いているようです。スクリプトのサポートが改善されただけかもしれません。関数は次のように表現されていると思います。

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

次に、スプ​​レッドシートで次を使用します。

= lastValue(E17:E999)

関数では、参照されたセルごとに1つの値の配列を取得します。これは、空でない値が見つかるか要素がなくなるまで、配列の末尾から逆方向に繰り返します。シート参照は、データが関数に渡される前に解釈される必要があります。多次元を扱うのに十分な空想もありません。質問は単一の列の最後のセルを要求したので、収まるようです。データが足りなくなった場合もおそらく死にます。

あなたの走行距離は異なる場合がありますが、これは私のために動作します。

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

ハードコーディングなし。

5
desnyki

これは私のために働く:

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

これは最後の値を取得し、空の値を処理します。

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
5
Nader

空白のある列では、最後の値を取得できます

=+sort(G:G,row(G:G)*(G:G<>""),)
4
JPV

答え

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

libreOfficeでは正常に動作しません。ただし、わずかな変更で完全に機能します。

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

真の範囲が(G2:G10000)より小さい場合にのみ常に機能します

4
Manuel Ferreira

元の質問に厳密にトピック外の回答で答えることは受け入れられますか?)おそらくUい?ただし、スプレッドシートの通常の操作では効果的です。

=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

これは、Excelおよびopenofficeでsimilarのように機能することが多いという利点を持つ配列式で確実に配信できるスクリプト領域の一連の質問に対する考えとして提供されています。

3
DavidF

私は@tinfiniによって与えられたコードで遊んでいて、人々が少しエレガントなソリューションだと思うものから恩恵を受けるかもしれないと考えました(スクリプトが元の答えを作成したとき、スクリプトがまったく同じように機能しなかったと思います)...

//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]);
}

使用法では、次のようになります。

=LastInRange(D2:D)
3
Jonathan Cavell
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());
3
Marian

私は別の方法を見つけたかもしれません

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )-最後の行を返します

Anabの詳細はこちら https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI

2
irriss

テーブルの下部から空白を削除するために機能するわずかなバリエーションが見つかりました。 = index(G2:G、COUNTIF(G2:G、 "<>"))

2
Chris

@Jon_Schneiderのコメントに関して、列に空白のセルがある場合は、単にCOUNTA()を使用します

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

これまで誰もこの答えを出したことがないことに驚いています。しかし、これは最短でなければならず、Excelでも動作します:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>""は、1/true(1)および1/false(0)の配列を作成します。 LOOKUP2を見つけるためにトップダウンのアプローチを行うため、2は検出されないため、最後の非空白行に到達し、その位置を示します。

これを行う他の方法は、他の人が言及したかもしれないように、

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

非空白行のMAXimum ROWを見つけて、INDEXにフィードする

空白がゼロの割り込み配列では、INDIRECT _RC表記法とCOUNTBLANKの使用は別のオプションです。 V4:V6がエントリで占められている場合、

V18

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

v6の位置を示します。

1
TheMaster

列から最後の値を取得するには、MAX関数とIF関数を使用することもできます。

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
1
player0