1

一種の「スタック」を作成したいのですが、アイテムを削除するたびに、シートは空白のセルを削除します。明らかに、これにはフィルター関数を使用できません。

この目的のために作成された配列の読み取りに問題があります。

私の非常に疑似コード:空の配列を作成し、すべての値(空のものを含む)を取得し、空のものを除くすべての値を配列に入力し、最後にスタックをクリアして配列で値を設定します。

これが私のコードです:

function updateStack() {
 
 var ss = SpreadsheetApp.getActive();
 var sheet = ss.getSheetByName("main");
  
 var zone = sheet.getRange(1, 1, 1, 10);
  
  //seems that .getValues() returns a 2d array

 var values = zone.getValues();
 var j = 0;
  
 var data = new Array();
  
  for (var i = 0 ; i < 10 ; i++) {

    //the problem seems to be here : I can't access the 2d array. After reading the debugging console about 1000 thousand times
    // I discovered the 2 pairs of []  
    
    //I've found multiple ways to detect empty cells. Not sure if this is the right one. I've tried the .length = 0 trick, but something
    // was wrong, maybe because of the "2dimensionality"

    
    if (values[i] != "") {
      
      data[j] = values[i];
      j = j++;
      
    } else {
      
      // do nothing if the cell contains nothing
     
    }
   
  //not sure if I have to use return ! Don't know where to put it exactly too...
  return data; 
  zone.clear();
    //length of range must be the same as the array's length
    
  zone = sheet.getRange(1, 1, 1, data.length);
  zone.setValues(data);
  }
}

私のコードには多くのコメントがありますが、ご理解いただければ幸いです。テストシートへのリンク: http://bit.ly/1JiWutn

助けてくれてありがとう!

4

2 に答える 2

1

現在、次のようなコードのセクションがあります。

if (values[i] != "") {

  data[j] = values[i];
  j = j++;

} else {

空の文字列をテストしています:

values[i] != ""

しかしvalues[i]、内部配列です。コードは 1 行と 10 列しか取得していません。

var zone = sheet.getRange(1, 1, 1, 10);

したがって、配列は次のようになります。

[ [cell one,cell two,cell three,etc,cell ten ] ]

values[i]値ではなく、内部配列を返します。

セル値を取得するには、次を使用します。

if (values[0][i] != "") {

2 つのインデックスが必要です。最初のインデックスは常にゼロになります。すべてのセル値を含む内部配列は 1 つだけです。

次に、 を使用して配列pushに値を追加します。data

data.push(values[0][i]);

別の問題は、returnステートメントがある場所です。returnステートメントは現在の関数を強制終了します。その関数内のステートメントの後のreturnものは実行されません。そのため、ある場所に return ステートメントを配置して、スプレッドシートに値を書き込むコードを取得することはできません。両方できます。シートに値を書き込んで何かを返すことはできますが、最後に戻り値を置きます。return は、この関数と呼ばれる関数に何かを返します。

値を設定するには、値が 2 次元配列でなければなりません。data配列は 2D 配列ではありません。data配列をさらに別の配列に追加する必要があります。

var my2Darray = [];
my2Darray.push(data);

zone = sheet.getRange(1, 1, 1, data.length);
zone.setValues(my2Darray);
于 2015-06-24T16:28:03.570 に答える
0

行全体の空白セルのみをテストしている場合、テストはほとんど使用できます。その配列内のすべての値を連結すると、結果を と比較できます""

// join all the values with nothing between them
// compare the result to empty string
if(values[i].join("") !== "") { 

  // if at least one cell contained something
  data.push(values[i]); // Stackius Popularious


}
于 2015-06-24T17:34:40.307 に答える