列の最後の値を選択する


回答:


54

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

脚本:

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()セル関数にフックして強制的に更新する方法があるかもしれません。私はそれをドキュメントで見つけることができません。


5
これはGoogleスプレッドシートスクリプトです。次の場所に新しいスクリプトを作成できますTools -> Scripts -> Script editor...
tinifni 2010年

1
:Oすごい!Googleがスクリプトを実装したことを知りませんでした。ありがとうございました。完璧に機能しました
cambraca 2010年

1
シートのデータを変更したときに自動的に更新する方法はありますか?
cambraca 2010年

役立つはずのいくつかの情報を使用して、回答を編集しました。幸せなコーディング!
tinifni

5
このスクリプトを編集して、lastValue( "Sheet1!A")gist.github.com/2701061
johnwardsの

165

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

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

12
データセットに空白がない限り、これは機能するようです
キースサーモンズ2013年

もう1つの優れたリソースは、productforums.google.com / forum /#!topic / docs / p3t3feg7Jicで選択された回答でFILTER()あり、@ Getaの回答と同様に、ed範囲の最初、最後、またはn番目の行を取得する方法を示します。
Aaron Blenkush 2013年

この回答stackoverflow.com/a/8161172/418111には、空白セルをサポートする数式があります。
ダニエル

8
@KeithSirmonsが述べたように。列に空白が含まれていると、COUNT(G2:G)0が返されるため、機能しません。代わりCOUNTA(G2:G)に、データセット内の値の数のみをカウントするを使用してください。値の間に空白が1つもない場合にCOUNTAのみINDEX、最後の値を取得するのに役立ちます。
Christiaan Westerbeek、2015年

3
また、値が数値でない場合は、が必要になりCOUNTAます。COUNT数値のみをカウントします。たとえばテキストセルを指定すると、0を返します。
Air

53

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

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

2
うわーこれは信じられないほどきれいです。それがどのように機能するかを正確に説明できますか?
cambraca

本当にそうではありません。ソース範囲がすでにソートされているときだけです。
カリガリ2012年

5
説明:ROW行番号をFILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )返すため、[1,2、3、7、12、14]のように、空白ではないすべての行番号(値ではない)の配列を返します。次にMAX、最後の行番号を指定します。FILTER次に、秒が適用され、行番号がfromの値MAX(つまり、最後の非空白行の値)と一致しないすべての行がフィルターで除外されます。
jhabbott

(特定の列の最後の値の代わりに)特定の行の最後の値を返すために、ROWの両方のインスタンスをCOLUMNで置き換えることができます。
Jon Schneider

2
列の最後の値の行番号が必要な場合はどうなりますか?
Nick5a1 2013年

44

現在のところ、LAST()関数は、範囲内の最後のセルを選択するために実装されていません。しかし、あなたの例に従ってください:

=LAST(G2:G9999)

次のように、INDEX()関数とCOUNT()関数を使用して、最後のセルを取得できます。

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

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


1
これはうまく機能し、シートが変更されると自動更新されます。ありがとう!
TinaMarie

8
私はこの提案の簡潔さを気に入っていますが、COUNT()は空白セルをカウントしないため、ターゲット範囲に空白セルが含まれている場合(上記の最初の質問で述べたように)は機能しないようです。
Jon Schneider

@JonSchneider COUNTAは、列の値の間に空白が1つもないことが確実な場合に使用できます。dohmooseの回答に対する私のコメントを参照してください。
Christiaan Westerbeek、2015年

なぜ:G最後の要素を表すのですか?これは文書化されていますか?
flow2k

33

概要:

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

詳細:

私はいくつかの回答を調べて試してみましたが、ここに私が見つけたものがあります:空白がない場合、最も簡単な解決策(Dohmooseの回答を参照)が機能します。

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

ブランクがあると失敗します。

からCOUNTに変更するだけで、1つの空白を処理できますCOUNTAuser3280071の回答を参照)。

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

ただし、これは空白の組み合わせによっては失敗します。(1 blank 1 blank 1私にとって失敗します。)

次のコードは機能します(Naderの回答jasonのコメントを参照):

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

しかし、それはあなたが使用したいのかCOLUMNSROWS、特定の範囲でます。

ただし、にCOLUMNS置き換えられた場合COUNT、信頼できる空白のない実装が得られるようです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) )

各イテレーションの手順と機能と制限を確認するのに非常に役立ちます。各行の最後の値を取得する必要がありました。複数の空白があるものもあります。これは魅力のように働きました。ありがとうございました!
Christiaan Adams

9

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

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

1
ただし、値の間に単一の空白がない場合のみ。存在する場合、 COUNTAと組み合わせるとINDEX、列の最後の値が返されません。
Christiaan Westerbeek、2015年

7

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

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

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


6

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

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

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

私のスプレッドシートでは、次に使用します。

= lastValue(E17:E999)

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

あなたの走行距離は変わるかもしれませんが、これは私にとってはうまくいきます。


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

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


5

これは私のために働きます:

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

空のセルの存在下でも機能する素晴らしいソリューション。
jochen 2015年

5

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

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

列に対しても機能します。私はいくつかのことを置き換えました。=INDEX( FILTER( 88:88 , NOT(ISBLANK(88:88))) , columns( FILTER( 88:88 , NOT(ISBLANK(88:88)) ) ) )
ジェイソン2014

一般的なソリューション:=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
jason 2014

私にとって、これは「正しい」答えです。適度にコンパクトで理解しやすく、ブランクで動作します。
aardvarkk 2017年

4

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

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

素晴らしい解決策。ただし、@ Pedroのバリアント(INDEXおよびMAXを使用)は、SORTを使用するよりも少し効率的かもしれません。
jochen 2015年

4

答え

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

LibreOfficeでは正しく機能しません。ただし、小さな変更で、完全に機能します。

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

常に真の範囲が (G2:G10000)


この投稿は、リブレオフィスに関連する「Googleスプレッドシート」と「Google Appsのスクリプト」、何をタグ付けされた...あなたがトピックオフにしている
insasセルジュ

質問のタイトルであるトピックの最後の値を選択するというトピックからそれほど離れていないトピックは、LibreOfficeまたはNumbersを使用している貧しい人々が簡単に見つけることができます。私は危険なことを知っているスプレッドシートのアマチュアです。私が収集できるのは、範囲に対する2番目の引数が列だけの場合、列の残りの部分が選択されるようにGoogleが作成したため、発見された非常に多数のハックを人々が使用する必要がないということです。
アーロン

3

元の質問に完全にトピックから外れた回答で答えても問題ありませんか?)スプレッドシートに数式を記​​述して、これを行うことができます。おそらく醜いですか?スプレッドシートの通常の操作では効果的です。

=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 で同様の方法で機能することが多いという利点を持つ配列数式で確実に提供できるスクリプト領域のさまざまな質問に対する考えとして提供されています。


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

3

私は@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)

2

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

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

4
いいえ、それも機能しません。COUNTとCOUNTAの違いは、数値とテキストの違いにあり、ここでは関係ありません。
mhsmith 2014

2

私はそれがあなたを助けるかもしれない別の方法を見つけました

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

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


1
本当にそうではありません。ソース範囲がすでにソートされているときだけです。
カリガリ

2

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


1

これまで誰もこの答えを出していないことに驚いています。しかし、これは最短で、Excelでも機能します。

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

G2:G<>""1 / true(1)および1 / false(0)の配列を作成します。以来LOOKUP見つけるために、トップダウン・アプローチを行います2、それが2を見つけることは決してないだろうので、それは最後の非空白行にまで来て、その位置を与えます。

他の人が述べたように、これを行うもう1つの方法は次のとおりです。

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

非空白行のMAXイミュムROWを見つけてそれをフィードするINDEX

ブランクの割り込みがゼロの配列INDIRECT RCCOUNTBLANK は、別のオプションとして表記法を使用します。V4:V6がエントリで占められている場合、

V18

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

V6の位置を示します。


1

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

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.