2013-07-13 5 views
27

私はAからHまでのデータを持つシートを持っています。単一の列の最後の行を決定する

データを含む列Aの最後の行を特定する必要があります(すべてが連続しているため、データ/行にギャップがありません)。

も列Aよりもデータのよりの行を持って、他の列のデータがあるので、私は唯一の列Aを隔離する必要があります。 (および/または列内の範囲だけA)。

私がGoogle Appsスクリプトソリューションのための私の再探索の全てにしかし

=COUNTA(A2:A100) 

を使用してスプレッドシートレベルでこれを行うことができ、私は見つけるように見えるすべてのコードの行数十を網羅する複数の機能を実行するための要件です - i++のものをたくさん含んでいます... A1から直接オフセットすることで、あまり複雑ではありませんでした。

このメソッドを変更する列固有の方法がありますか?

var aLast = ss.getDataRange().getNumRows(); 

複雑なプロセスが必要な場合は、そのようにしてください。しかし、よりシンプルな解決策を想像するのは難しい(見つけにくい!)。

誰かが私を啓発したい(または気泡をぽんと鳴らす)のが気になりますか?

答えて

63

を使用したい通常の方法でそれを使用しますか?

var Avals = ss.getRange("A1:A").getValues(); 
var Alast = Avals.filter(String).length; 

私はthis answerからこのアイデアを借りました。 Array.filter()メソッドは、列Aのすべてのセルを含むAvals配列で動作しています。ネイティブ関数のコンストラクタをフィルタリングすると、null以外の要素のみが返されます。

これは単一の列でのみ機能します。範囲に複数の列が含まれている場合、結果はfilter()になり、すべての列のセルが含まれるため、範囲が移入された次元外になります。

+4

非常に狡猾です。 JavaScriptを理解して創造的に考えることを楽しみにしている日を楽しみにしています。納期どおり、私はそう思う。しかしその間に、私はあなたの考え方を見て楽しんでいます。あなたのソリューションのインスピレーションを挙げて、あなたに誇りを持ってください。高級。もう一度ありがとう。 – 5th4x4

+1

経験豊富なコーダーにとっては、ほとんどの場合、その範囲が単一の列以上に及ぶことはないことが明らかです。これは私が得たものではありませんでしたが、Mogsdadはこれを1つ以上の列にまたがることはできないというコメント(削除されました)で指摘しました。もう一度、私はちょうど私の経験レベルにあり、まだいくつかの概念をつかむのに苦労している人のためにこれをここに入れたいと思います。ありがとう、Mogsdad。 – Soundfx4

+0

これは私が必要なものです、ありがとう! – Jordan

7

列方向の式はありませんが、列Aの最後の行を見つけるのに何十行ものコードを必要としません。この簡単な関数を試してみてください。セルにあなたはどのようにJavaScriptのトリックを使用する方法についていくつかの他の機能=CountColA()

function CountColA(){ 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var data = sheet.getDataRange().getValues(); 
    for(var i = data.length-1 ; i >=0 ; i--){ 
    if (data[i][0] != null && data[i][0] != ''){ 
     return i+1 ; 
    } 
    } 
} 
+0

上記戻り、ワークシート全体ではなく、私はスクリプト自体内で使用するための変数の形でCOL Aの最後の行のみを必要とするCOL Aの最後の行を: コードは以下のようになります。これには魔法の丸薬がないので、私は空からペダルを叩くまでA1からループダウンします。とにかくありがとう。 – 5th4x4

+1

申し訳ありませんが、それは私の最後から小さなエラーでした。修正されたスクリプトをご覧ください。 – Srik

0

ただ、これを使用しない:

が//列または最後の列のインデックスのないを取得するには

するvar numColumnsの= sheet.getLastColumn()

//取得するには行番号または最終行のインデックス番号

var numRows = sheet。getLastRow()

VARシート= SpreadsheetApp.getActiveSheet()

+2

これは空のセルも含めてシート全体を見ていますが、OPのように聞こえません。 –

0

私は行インデックスまたは列インデックスを指定するgetLastRow/getLastColumn機能を書き直し。

function get_used_rows(sheet, column_index){ 
     for (var r = sheet.getLastRow(); r--; r > 0) { 
     if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(r, column_index).getValue() != ""){ 
      return r; 
      break; 
     } 
     } 
    } 

function get_used_cols(sheet, row_index){ 
    for (var c = sheet.getLastColumn(); c--; c > 0) { 
    if (sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn()).getCell(row_index, c).getValue() != ""){ 
     return c; 
     break; 
    } 
    } 
} 
3

これは、逆の方法で行うことができます。 スプレッドシートの最後の行から始まり、値を取得するまで上がっていきます。間に空の行がある場合でも、これはすべての場合に機能します。

var iLastRowWithData = lastValue('A'); 
function lastValue(column) { 
    var iLastRow = SpreadsheetApp.getActiveSheet().getMaxRows(); 
    var aValues = SpreadsheetApp.getActiveSheet().getRange(column + "2:" + column + lastRow).getValues(); 

    for (; aValues[iLastRow - 1] == "" && iLastRow > 0; iLastRow--) {} 
    return iLastRow; 
} 
関連する問題