2

空行を削除したい。行 885 は空でない行であり、保持する必要があります。ただし、私のコードは、885 が空であり、削除する必要があることを示しています (およびメッセージボックスに表示されます)。i=884 に達すると、885 行に実際にあるものを出力し、削除されないことを示します。だから、私は混乱しています。データに対して適切に動作しているように見えますが、行番号が間違っていると報告しています。オフセットは 0 ベースで、行は 1 から始まるので、lastrow=888 (1 ベース) の場合は、オフセットを一致させるために 1 を減算する必要があります。スプレッドシートの行 885 は、実際にはオフセットとしての行 884 です。

しかし... i=行885にデータがある場合、オフセットは884です。そして、i=884の場合、オフセットは883です...では、なぜ行885にあるものを印刷するのですか??? ここで大混乱。私は何を間違えていますか?

最後になりましたが、最も重要なことは、間違った行を削除しているということです! 正しいデータを参照しながら、間違った行を削除するにはどうすればよいでしょうか?

var s = SpreadsheetApp.getActiveSheet();
var range = SpreadsheetApp.getActiveSheet().getDataRange();
var i = range.getLastRow();
var msg;
var colNum;

for (; i > 1; i--) {  // I like to start at the end
  var foundAvalue=0;  // reset flag for each row

  rowRange = range.offset(i, 0, 1); 

  var valArray=rowRange.getValues();
  var foundAvalue=0;
  var msg;
  var totalColumns=rowRange.getNumColumns();

   colNum=0;   

   while (colNum < totalColumns && (foundAvalue==0)) {
     if (valArray[0][colNum] != '') {       
       foundAvalue=1; 
       msg="Row " + i + " =" + valArray[0];
       Browser.msgBox(msg);
       msg="Row " + i + " will not be deleted";
       Browser.msgBox(msg);
     }
     colNum++;
   }
   if (foundAvalue == 0) {
      msg="Row " + i + " =" + valArray[0] + "WILL be deleted";
      Browser.msgBox(msg);
           // delete empty row
      // s.deleteRow(i);
   }

 } // end for(i)  
4

2 に答える 2

3

以下は、あなたが望むことを達成するはずのコードです。問題の根本は 0 ベースのインデックス付けにあるという点で、あなたは正しいです。注意が必要な部分は、JavaScript/Apps Script 配列が 0 ベースのインデックスを使用することですが、 のようなものを呼び出すとgetLastRow()、返される範囲は 1 ベースになります。全体として、あなたのコードは優れています。あなたをつまずかせているのはその問題だけです。お役に立てれば:

function DeleteFun(){
  var mySheet = SpreadsheetApp.getActiveSheet();
  var range = mySheet.getDataRange();

  // Iterate using a counter, starting at the last row and stopping at
  // the header (assumes the header is in the first row)
  for (i = mySheet.getLastRow() - 1; i > 0; i--) {
    var foundAvalue = 0;
    // Here we get the values for the current row and store in an array
    rowRange = range.getValues()[i]
    // Now we iterate through that array
    for (j = 0; j <= rowRange.length; j++) {
      // If any non-nulls are found, alert they won't be deleted and move on
      if (rowRange[j] != null && rowRange[j] != '') {
        foundAvalue = 1; 
        msg="Row " + (i+1) + " =" + rowRange[0] + " and will not be deleted";
        Browser.msgBox(msg);
        break;
       }
    }

    if (foundAvalue == 0) {
      msg="Row " + (i+1) + " =" + rowRange[0] + "WILL be deleted";
      Browser.msgBox(msg);
      // Delete empty row
      mySheet.deleteRow(i+1);
    }
  }
}
于 2012-11-18T19:33:27.257 に答える
1

シートで数式を使用しない場合は、「純粋な」配列でも実行できます。

たとえば、次のようにします。

function deleteEmptyRows(){ 
 var sh = SpreadsheetApp.getActiveSheet();
 var data = sh.getDataRange().getValues();
 var targetData = new Array();
 for(n=0;n<data.length;++n){
 if(data[n].join().replace(/,/g,'')!=''){ targetData.push(data[n])};// checks the whole row
 Logger.log(data[n].join().replace(/,/g,''))
 }
 sh.getDataRange().clear(); // clear the whole sheet
 sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);//write back all non empty rows
 }
于 2012-11-18T20:05:14.733 に答える