首页 > 解决方案 > 谷歌脚本删除行

问题描述

嘿,我正在尝试编写一个 google 脚本,该脚本将根据 True / False 语句删除行。我正在使用复选标记,并让它删除该行。还有一种方法可以连续运行还是我每次都必须手动运行?

我似乎无法运行代码以删除带有复选标记的行

function deleteRow()  {
  
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  
  var editSheet = ss.getSheetByName("EDIT");
  
  var lastRowEdit = editSheet.getLastRow();
  
  for(var i = 4; i <= lastRowEdit; i++)
  {
    
    if(editSheet.getRange(i,4).getValue() == 'TRUE')
    {
      editSheet.deleteRow(i);
      
  
}

  }
  
  
}

谷歌表格模板

标签: javascriptgoogle-apps-scriptgoogle-sheets

解决方案


解释/问题:

  • 如果您的工作表列包含TRUE/FALSE值,这些值将作为 Google Apps 脚本中的 javascript 布尔值返回。因此,您需要进行的比较是getRange(i,4).getValue() == true而不是getRange(i,4).getValue() == 'TRUE'.

  • 在循环中调用getRange和调用是非常低效的。如果您有很多数据,这可以很快达到配额。getValuefor

  • 正确的解决方案是获取 column 中的数据D。我看到您想从第 4 个单元格开始,因此editSheet.getRange('D4:D'+ editSheet.getLastRow()). 但这将是一个二维数组。您对特定列感兴趣。因此,拥有一维数组更为自然。这就是为什么你可以十它。

  • 现在您已经存储了数据,您想要删除行。但是每次删除一行时,工作表的结构都会发生变化,因此它不会映射您的原始数据。这就是您需要向后迭代的原因。我在这里使用了一个forEach循环来使我的代码更清晰,因此我可以反转我的数据集,以便我从末尾迭代每个元素。

  • 由于coldD包含 javascript 布尔值。我可以直接使用if(r).

解决方案:

function deleteRow(){

  const ss = SpreadsheetApp.getActiveSpreadsheet()
  const editSheet = ss.getSheetByName("EDIT");
  const colD = editSheet.getRange('D4:D'+ editSheet.getLastRow()).getValues().flat();  
  colD.reverse().forEach((r,i)=>{
     if(r){ 
      editSheet.deleteRow(colD.length-i+3);
  }});
 
}

推荐阅读