首页 > 解决方案 > Google Script App删除Google工作表中特定列中具有特定值的重复行

问题描述

我有一个谷歌表,人们在其中提交他们正在处理的任务,他们将提交一个状态更新,比如说任务 A,它要么是“进行中”,要么是“完成”。任务 A 在 D[4] 列中,状态是在 E[5] 列中。我试图让此代码仅在存在状态为“完成”的重复任务 A 时删除任务 A 的“进行中”行。这适用于识别重复并按顺序删除重复的行,但我不确定如何让它在有“任务 A”“完成”行时只删除重复的“任务 A”“进行中”行。任何帮助将非常感激!

function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet2");
  var data = sheet.getDataRange().getValues();
  var newData = [];
  for (i in data) {
    var row = data[i];
    var duplicate = false;
    for (j in newData) {
      if(row[3] == newData[j][3]){
  duplicate = true;
}
    }
    if (!duplicate) {
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

标签: if-statementgoogle-apps-scriptgoogle-sheets

解决方案


我会尝试

function removeDuplicates()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("test");
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  var indexOfStatusColumn = 4;
  var newData = [];
  data.forEach(function (row, rowI){
    var isDuplicate = false
    if (newData.length)
    newData.forEach(function (dup, dupI)
    {
      if (dup[3] == row[3])
      {
        if (row[indexOfStatusColumn] == "Complete" && dup[indexOfStatusColumn] != "Complete")
          newData[dupI][indexOfStatusColumn] = "Complete";
        isDuplicate = true;
        return (false);
      }
    })
    if (!isDuplicate)
      newData.push(row);
  });
  dataRange = sheet.getRange(2, 1, dataRange.getLastRow() - 1, dataRange.getLastColumn());
  dataRange.clearContent();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

一些事情

  1. 我使用forEach()循环它更有效
  2. 通过返回来打破循环false以避免解析所有newData无用的槽
  3. 当我找到重复项时,我会执行其中一些操作
    1. 检查是否重复Complete打开,如果是data,则不打开newData
    2. 将值更改newData为“完成”,这样它将保持完整状态(如果两行上的数据不同,则可能会扭曲数据,请小心)。
  4. 也使用clearContent()from a range 来避免删除工作表的所有内容,但只删除其中的特定部分。在这里,我重建了它以保留标题

参考

forEach()

田池基准

清除内容()


推荐阅读