2017-09-24 31 views
0

私はプロですが、私はこのスプレッドシート用のGoogle Scriptが必要です。私はパズルの断片を探してコードを作りました。最後には動作しますが、非常に遅いです。誰か助けてくれますか?私は、コードがどのように動作するかをスローモーションで見ることができます。 :-(スプレッドシート用のGoogleスクリプトは非常に遅い

スプレッドシートまたはシートには多くのエントリがありますが、一部の行は空白です(1000行以上)。フィルタ機能を使用すると、これらの行を非常に速く非表示にすることができます。私は私がスクリプト内のすべてのステップを組み合わせて、ボタンで使用できるようにすることができたと思っていましたが、空の行を隠している部分がありました。

スクリプトは、1または0があるかどうかをチェックします。0がある場合、行は非表示になります。スクリプトは7行目から1150まで開始します。私のコードがゴミであればスクリプトでフィルタ機能を有効にすることはできますか?

function hideRows() { 

    var ss = SpreadsheetApp.getActiveSpreadsheet(); 
    ss.setActiveSheet(ss.getSheetByName("Order")); 
    var sheet = SpreadsheetApp.getActiveSheet(); 
    var column = 14; 
    var cell = 0; 
    var lastRow = SpreadsheetApp.getActiveSheet().getLastRow(); 

    for (var row = 7; row < lastRow; row++) { 
    cell = sheet.getRange(row, column).getValues(); 
    if (cell == 0){ 
     sheet.hideRows(row); 
    } 
    else { 
     sheet.showRows(row); 
    } 
    } 
} 
+2

配列内のすべての値を取得してから、一度に1つずつ値を取得するのではなく、ループ内で繰り返し処理する必要があります。それははるかに速くなります。 – Cooper

答えて

0

この試してみてください:あなたがまっすぐにそれを維持する必要がありますので、配列インデックスが1行未満と列の数であるが、一度にすべてのデータを取得し、ループ

function hideRows() 
{ 
    var ss=SpreadsheetApp.getActive(); 
    var sh=ss.getSheetByName('Sheet1').activate(); 
    var rg=sh.getDataRange(); 
    var vA=rg.getValues(); 
    for (var i=6;i<vA.length-1;i++)//vA.length-1 stops before last row i=6 is row 7 
    { 
    if (vA[i][13] == 0) 
    { 
     sh.hideRows(i+1); 
    } 
    else 
    { 
     sh.showRows(i+1); 
    } 
    } 
} 

を各値のスプレッドシートにアクセスするのではなく、配列を読み込むので、はるかに高速に実行されます。

0

getValues()メソッドは2D配列を返しますので、代わりにgetValue()を使用して、ターゲットとするセルの内容を返します。私は2次元配列によってインクリメントとして、あなたは少し良く構文/フォーマットを持っている投稿スニペットを書き直しするセルをインクリメントするよりもはるかに高速です/範囲:あなたが何をしようとして達成すべき

function hideRows() { 

    var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Order"); //get sheet 
    var nRows = sheet.getLastRow() - 7; //# of rows to search 

    var values = sheet.getRange(7, 14, nRows, 1).getValues(); //Get 2D array of values [[],[],...] 
    //increment through the full index range of values (0-7) 
    for (var i in values) { 
    if (values[i][0] == 0) sheet.hideRows(i+7); //i+7 is the rowIndex (7-14) 
    else sheet.showRows(i+7); 
    } 
} 

を。問題や疑問がある場合は教えてください。

関連する問題