列の最後の値を選択します
質問
列Gにいくつかの値があるスプレッドシートがあります。一部のセルはその間に空です。その列から最後の値を別のセルに入れる必要があります。
何かのようなもの:
=LAST(G2:G9999)
それ以外で LAST
機能ではありません。
解決
したがって、このソリューションは、文字列をパラメーターとして取得します。シートにはいくつの行があるかがわかります。指定された列のすべての値を取得します。空の文字列ではない値が見つかるまで、最後から最初まで値をループします。最後に、値を返します。
脚本:
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()
そして、細胞機能に強制的に更新します。ドキュメントには見つかりません。
他のヒント
同様の答え カリガリの答え, 、しかし、完全な列の範囲を指定するだけで整理することができます。
=INDEX(G2:G, COUNT(G2:G))
実際、私はここでより簡単な解決策を見つけました:
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)))))
last()関数は、範囲内の最後のセルを選択するために現時点では実装されていません。ただし、例に従ってください:
=LAST(G2:G9999)
いくつかの機能を使用して最後のセルを取得することができます 索引() と カウント() この上:
=INDEX(G2:G; COUNT(G2:G))
があります ライブの例 私が同じ問題を見つけた(そして解決した)spreedsheetで(シート Orzamentos
, 、セル I5
)。ドキュメント内の他のシートを参照することさえ完全に機能することに注意してください。
概要:
=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )
詳細:
私はいくつかの答えを調べて試しましたが、ここに私が見つけたものがあります:最も単純な解決策(参照 dohmoose '答え)ブランクがない場合は動作します。
=INDEX(G2:G; COUNT(G2:G))
ブランクがある場合、失敗します。
変更するだけで1つを処理できます COUNT
に COUNTA
(見る user3280071の回答):
=INDEX(G2:G; COUNTA(G2:G))
ただし、ブランクの組み合わせではこれは失敗します。 (1 blank 1 blank 1
私のために失敗します。)
次のコードが機能します(参照してください ネイダーの答え と ジェイソンのコメント):
=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))
これを試して:=INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))
あなたが最後の値を探している列がBであると仮定します。
そして、はい、それはブランクで動作します。
Google Appsスクリプトは、関数パラメーターとしての範囲をサポートするように見えます。このソリューションは範囲を受け入れます。
// 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 Helpフォーラムでディスカッションを参照してください。 処方に再計算を強制するにはどうすればよいですか?
私は以前の答えを見ましたが、彼らはあまりにも一生懸命働いているように見えます。たぶん、スクリプトサポートが単純に改善されたのかもしれません。この機能は次のように表現されていると思います。
function lastValue(myRange) {
lastRow = myRange.length;
for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
{ /*nothing to do*/ }
return myRange[lastRow - 1];
}
私のスプレッドシートでは、次のように使用します。
= lastValue(E17:E999)
関数では、参照されたセルごとに1つの値を使用して一連の値を取得します。これは、空でない値が見つかるか、要素がなくなるまで、配列の端から後方に反復します。データが関数に渡される前に、シート参照を解釈する必要があります。多次元を処理するのに十分な空想でもありません。質問は、単一の列の最後のセルを求めていたので、適合しているようです。データがなくなった場合、おそらく死ぬでしょう。
あなたの走行距離は異なるかもしれませんが、これは私にとってはうまくいきます。
function lastRow(column){
var sheet = SpreadsheetApp.getActiveSpreadsheet();
var lastRow = sheet.getLastRow();
var lastRowRange=sheet.getRange(column+startRow);
return lastRowRange.getValue();
}
ハードコーディングはありません。
これは私のために働いています:
=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
これは最後の値を取得し、空の値を処理します。
=INDEX( FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
ブランクのある列で、あなたは最後の値を取得できます
=+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のファッション。
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());
私は@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))
私は別の方法があなたを助けるかもしれないと見つけました
=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 )
- 最後の行を返します
ANABの詳細については、こちら:https://groups.google.com/forum/?fromgroups=#!topic/how-to-documents/if0_fgvinmi
テーブルの底から空白を排除するために働くわずかなバリエーションを見つけました。 = index(g2:g、countif(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
imum ROW
非空白の列の給餌 INDEX
ゼロブランク中断アレイで、使用します INDIRECT
RC
との表記 COUNTBLANK
別のオプションです。 V4:V6がエントリで占められている場合、
V18:
=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)
V6の位置を与えます。
列から最後の値を取得するには、使用することもできます MAX
で機能します IF
働き
=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))