0

最初の列に名前が含まれ、次の 17 列に 0、1、または空のスプレッドシートがあります。すべての行は次のようになります。

foobar 0 0 0 1 0 1 // and so on

メニューから呼び出される関数を作成して、ユーザー1にターゲット列 ( arg1) の行のみを表示する必要があります。コードは次のとおりです。

var ssBase = SpreadsheetApp.getActiveSheet();
var last = ssBase.getLastRow() ;
var data = ssBase.getDataRange().getValues();

function SkillsFilter(arg1){

  ssBase.showRows(1, last+1);

  for (var i=1; i < last; i++){
    if (data[i][arg1] != "1"){                         
      ssBase.hideRows(i+1);
}}}

この関数は、私が望むほど速く実行されません。どうすればパフォーマンスを向上させることができますか? キャッシュは私または他の何かを助けますか?

4

2 に答える 2

2

ループ内でスプレッドシート サービスに対して多くの呼び出しを行っています。forこれらの多くの操作を 1 つに変更できれば、速度が大幅に向上します。背景とガイダンスについては、ベスト プラクティスを参照してください。

さまざまなデータ行を非表示にして表示するアプローチを再考することをお勧めします。代わりに、フィルター処理されたリストを表示し、メニュー機能を使用してそのフィルターを操作できます。あなたが持っているデータがこのように見えるとしましょう...

サンプル スプレッドシート

スプレッドシートの 2 番目のタブでは、フィルター処理されたバージョンのリストを提供できます。セル A2 の次の数式は、元のデータ シート (この例では "マスター" と呼ばれます) からフィルター処理されたデータのリストを作成します。

=filter(Master!A2:R;Master!D2:D="1")

そのフィルターをプログラムで作成するには、setFormulaR1C1()関数を使用します。メニュー項目から呼び出して、特定の列のフィルターを設定できる関数を次に示します。

/**
 * Sets the filter in cell A2 of the sheet named "Filter" to display
 * only rows with a number 1 in the indicated column.
 *
 * @param {number} column The "skill" column to filter for
 */
function setFilter(column) {
  column = column | 2;  // Use first "skill" column as default
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Filter");
  var formula = "Master!R[0]C[0]:C[17];Master!R[0]C["
       +column
       +"]:C["
       +column
       +"]=1";
  sheet.getRange("A2").setFormulaR1C1(formula);
}
于 2013-01-10T18:52:55.820 に答える
1

このコードは、列範囲を考慮して、数値 1 を含むすべての行を表示します。

function mySort() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // set col and row
  var col = sheet.getLastColumn(), row = sheet.getLastRow()-1;

  // hide all rows
  sheet.hideRows(2, row);   

  // itterate through columns
  for(var k=0; k<col; k++) {
    this.data = sheet.getRange(2, 1, row, col)
      .sort({column: parseInt(k+1), ascending: true}).getValues();

    //set counters
    var cFirst=0, cSecond=0;

    // itterate to find number of "1" rows in column k
    for(var i=0; i<row; i++) {    
      if(this.data[i][k] == 1) {
        cFirst++;
      } else {
        cSecond++;
      }
    }

    // calculate rowIndex
    var rIndex = row-cSecond;

    // show (unhide) only "1" rows
    sheet.showRows(rIndex+2, cFirst); 
  }
}

私が作成したサンプル ファイルを参照してください。ファイルを開くと、Sorting という別のメニュー項目が追加されます。そこで、遊んで何が起こるかを見ることができます。

于 2013-01-29T18:52:58.450 に答える