行由一个在谷歌电子表格报数(Row count off by one in google sprea

2019-07-03 22:03发布

我想删除空行。 行885是一个非空行,应予以保留。 然而,我的代码表示(并显示在MSGBOX)认为885是空的,应予以删除。 当它到达I = 884,将打印什么是真正的885行表示,它不会被删除。 所以,我很困惑。 这似乎是在该数据正确地作用,但它的报告行数错了。 我怀疑你要告诉我,偏移量是零基础,行从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)  

Answer 1:

下面是一些代码,要做到你想要什么。 您在该问题的根源是在基于0的索引正确。 最棘手的部分是,JavaScript的/ Google Apps脚本阵列使用基于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);
    }
  }
}


Answer 2:

你可以做到这一点在“纯”阵列,以及如果您在您的工作表不使用的公式。

像这样的例子:

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
 }


文章来源: Row count off by one in google spreadsheet