Google 工作表 deleteRow 在我的宏中不起作用

Google Sheets deleteRow not working in my Macro

我正在尝试构建一个宏来清除 D 列上所有具有空值的行。最初,我使用的是我发现的这段代码:

function deleteRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Datos Competidor 2 - EV');
  var r = s.getRange('D:D');
  var v = r.getValues();
  for(var i=v.length-1;i>=0;i--)
    if(v[0,i]=='')
      s.deleteRow(i+1);
};

然而,对 API 的调用次数过多,这使得它变得非常缓慢,有时甚至会因超时而失败。

我决定将所有满足条件的行添加到列表中,然后将其传递给 deleteRow() 以便使用此代码仅调用一次 API:

function deleteBlankRows() {
  emptyRange=[]
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Datos Competidor 2 - EV');
  var r = s.getRange('D:D');
  var v = r.getValues();
  for(var i=v.length-1;i>=0;i--)
    if(v[0,i]=='')
      emptyRange.push((i)+":"+(i));
  
  ss.getRangeList(emptyRange).activate();
  ss.getActiveSheet().deleteRows(ss.getActiveRange().getRow(), ss.getActiveRange().getNumRows());


      
};

执行似乎工作得很好,在 1 到 2 秒内完成,但是,在执行结束时,删除的行没有选择的那么多。

这是我看到的:

Final result

知道为什么会这样吗?

谢谢!

我相信你的目标如下。

  • 您想减少脚本的处理成本。

这样的话,使用表格API怎么样?使用Sheets API时,我认为删除行的处理成本可以降低一点。当 Sheets API 反映在你的脚本中时,它变成如下。

修改后的脚本:

在您使用此脚本之前,please enable Sheets API at Advanced Google services

function deleteRows() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var s = ss.getSheetByName('Datos Competidor 2 - EV');
  var values = s.getRange('D1:D' + s.getLastRow()).getDisplayValues();
  var sheetId = s.getSheetId();
  var requests = values.reduce((ar, [d], i) => {
    if (!d) ar.push({ deleteDimension: { range: { sheetId, startIndex: i, endIndex: i + 1, dimension: "ROWS" } } });
    return ar;
  }, []).reverse();
  Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}

参考文献:

删除 D 列为空的行

function deleteBlankRows() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const s = ss.getSheetByName('Datos Competidor 2 - EV');
  const r = s.getRange('D1:D' + s.getLastRow());
  const v = r.getValues().flat();
  let d = 0;
  v.forEach((e, i) => {
    if (!e) {
      s.deleteRow(i + 1 - d++)
    }
  })
}