Google脚本应用删除Google表格中特定列中具有特定值的重复行

时间:2018-10-26 17:00:38

标签: if-statement google-apps-script google-sheets

我有一个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);
}

1 个答案:

答案 0 :(得分:2)

我会尝试

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中的值更改为“ Complete”,它将保持完整状态(请注意,如果两行中都有不同的数据,可能会扭曲数据)。
  4. 还应使用clearContent()范围内的内容,以避免除去工作表中的所有内容,而仅除去其特定部分。在这里,我重建了它以保留标题

参考

forEach()

Tanaike benchmark

clearContent()