回答:
したがって、このソリューションでは、パラメーターとして文字列を使用します。シート内の行数を検出します。指定された列のすべての値を取得します。空の文字列ではない値が見つかるまで、値の最後から最初までループします。最後に、値を再調整します。
脚本:
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()
セル関数にフックして強制的に更新する方法があるかもしれません。私はそれをドキュメントで見つけることができません。
同様の答え caligariの回答の回答ですが、列の全範囲を指定するだけで整理できます。
=INDEX(G2:G, COUNT(G2:G))
FILTER()
あり、@ Getaの回答と同様に、ed範囲の最初、最後、またはn番目の行を取得する方法を示します。
COUNT(G2:G)
0が返されるため、機能しません。代わりCOUNTA(G2:G)
に、データセット内の値の数のみをカウントするを使用してください。値の間に空白が1つもない場合にCOUNTA
のみINDEX
、最後の値を取得するのに役立ちます。
COUNTA
ます。COUNT
数値のみをカウントします。たとえばテキストセルを指定すると、0を返します。
実際、私はここでより簡単な解決策を見つけました:
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)))))
ROW
行番号をFILTER( ROW(A10:A100), NOT(ISBLANK(A10:A100) )
返すため、[1,2、3、7、12、14]のように、空白ではないすべての行番号(値ではない)の配列を返します。次にMAX
、最後の行番号を指定します。FILTER
次に、秒が適用され、行番号がfromの値MAX
(つまり、最後の非空白行の値)と一致しないすべての行がフィルターで除外されます。
現在のところ、LAST()関数は、範囲内の最後のセルを選択するために実装されていません。しかし、あなたの例に従ってください:
=LAST(G2:G9999)
次のように、INDEX()関数とCOUNT()関数を使用して、最後のセルを取得できます。
=INDEX(G2:G; COUNT(G2:G))
同じ問題(シート、セル)を見つけた(そして解決した)スプレッドシートに実際の例があります。ドキュメント内の他のシートを参照していても完全に機能することに注意してください。Orzamentos
I5
COUNTA
は、列の値の間に空白が1つもないことが確実な場合に使用できます。dohmooseの回答に対する私のコメントを参照してください。
:G
最後の要素を表すのですか?これは文書化されていますか?
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
私はいくつかの回答を調べて試してみましたが、ここに私が見つけたものがあります:空白がない場合、最も簡単な解決策(Dohmooseの回答を参照)が機能します。
=INDEX(G2:G; COUNT(G2:G))
ブランクがあると失敗します。
からCOUNT
に変更するだけで、1つの空白を処理できますCOUNTA
(user3280071の回答を参照)。
=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)) ) ) )
しかし、それはあなたが使用したいのかCOLUMNS
、ROWS
、特定の範囲でます。
ただし、に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) )
テキスト値の列から最後の値を返すには、COUNTAを使用する必要があるため、次の式が必要になります。
=INDEX(G2:G; COUNTA(G2:G))
COUNTA
と組み合わせるとINDEX
、列の最後の値が返されません。
これを試して:
=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
最後の値を探している列がBであるとします。
そして、はい、それは空白で動作します。
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ヘルプフォーラムの説明もご覧ください:数式を強制的に再計算するにはどうすればよいですか?
私は以前の答えを見て、彼らは働きすぎているようです。たぶんスクリプトのサポートが改善されただけかもしれません。関数は次のように表現されていると思います:
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
私のスプレッドシートでは、次に使用します。
= lastValue(E17:E999)
関数では、参照セルごとに1つの値の配列を取得します。これは、空でない値が見つかるか、要素がなくなるまで、配列の最後から逆方向に反復します。データが関数に渡される前に、シート参照を解釈する必要があります。多次元にも対応できるほど豪華ではありません。質問は単一の列の最後のセルを要求したので、それは収まるようです。データが足りなくなった場合もおそらく死にます。
あなたの走行距離は変わるかもしれませんが、これは私にとってはうまくいきます。
これは最後の値を取得し、空の値を処理します。
=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)) ) ) )
=INDEX( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row())))) , columns( FILTER( indirect(row()&":"&row()) , NOT(ISBLANK(indirect(row()&":"&row()))) ) ) )
空白の列では、最後の値を取得できます
=+sort(G:G,row(G:G)*(G:G<>""),)
答え
$ =INDEX(G2:G; COUNT(G2:G))
LibreOfficeでは正しく機能しません。ただし、小さな変更で、完全に機能します。
$ =INDEX(G2:G100000; COUNT(G2:G100000))
常に真の範囲が (G2:G10000)
元の質問に完全にトピックから外れた回答で答えても問題ありませんか?)スプレッドシートに数式を記述して、これを行うことができます。おそらく醜いですか?スプレッドシートの通常の操作では効果的です。
=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 で同様の方法で機能することが多いという利点を持つ配列数式で確実に提供できるスクリプト領域のさまざまな質問に対する考えとして提供されています。
私は@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)
@Jon_Schneiderのコメントに関して、列に空白のセルがある場合は、COUNTA()を使用してください
=INDEX(G2:G; COUNT**A**(G2:G))
これまで誰もこの答えを出していないことに驚いています。しかし、これは最短で、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
RC
でCOUNTBLANK
は、別のオプションとして表記法を使用します。V4:V6がエントリで占められている場合、
V18:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
V6の位置を示します。
Tools -> Scripts -> Script editor...