0

我有工作表 A 和 B,来自工作表 A 的数据符合我的标准,我使用公式在工作表 B 上复制。由于某些数据不符合我的标准,我得到一个空行。

**问题陈述 **

我有一个脚本,我打算用它来删除工作表上的空行。但我注意到它同时删除了所有公式和所有格式。

我只需要删除非空行之间的行。例如第1,2行有数据,第5行有数据,所以只需要删除第3-4行,这个过程应该是自动的。

代码

    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])};
            Logger.log(data[n].join().replace(/,/g,''))
          }
          sh.getDataRange().clear();
          sh.getRange(1,1,targetData.length,targetData[0].length).setValues(targetData);
        }
4

1 回答 1

1

我看不到您的数据样本,也不知道您的工作表是什么样子,所以这只是另一个猜测:

function deleteEmptyRows() {
  const sh = SpreadsheetApp.getActiveSheet();
  const data = sh.getDataRange().getValues();
  const empty_rows = [];
  for (let i in data) if (data[i].join('') == '') empty_rows.push(+i+1);
  empty_rows.reverse().forEach(x => sh.deleteRow(x));
}

更新

查找最后一行的函数变体包含可见数据并删除上面的所有空(没有可见数据)行:


function delete_all_empty_rows_above_the_last_filled_row() {
  const sh = SpreadsheetApp.getActiveSheet();

  const data_all = sh.getDataRange().getValues();
  for (var last_row = data_all.length-1; last_row>0; last_row--) {
    if (data_all[last_row].join('') != '') break;
  }
  
  const data = sh.getRange(1,1,last_row+1,3).getValues();
  const empty_rows = [];
  for (let i in data) if (data[i].join('') == '') empty_rows.push(+i+1);
  empty_rows.reverse().forEach(x => sh.deleteRow(x));
}

更新 2

要使函数每次都在“A”列中的“IF Copy”表上发生更改时进行归档,您需要添加如下内容:

function onEdit(e) {
  if (e.range.getSheet().getName() != "IF Copy") return;
  if (e.range.columnStart == 1) 
    delete_all_empty_rows_above_the_last_filled_row();
}

onEdit()触发器仅在您手动编辑工作表时起作用。如果工作表通过某个公式或其他函数更改,则触发器不起作用。

于 2021-08-29T22:55:52.583 回答