0

我在这里查看此帖子,它与我正在为我的项目做的事情密切相关。我将如何更改它以使其工作如下:

我在“测试表”表上的 A 到 P 列中有数据。P 列提供“DisputeStatus”。状态可以是以下三种状态之一:NULL、PENDING 或 APPROVED。每天都会将新数据添加到行的底部。仅当每天将新数据添加到底部并且上面先前记录的行项目的“DisputeStatus”已更改时,才会创建重复项。因此,我现在将有 2 行在 A 到 O 列中具有完全相同的数据,但在 P 列(“DisputeStatus”)中会有所不同,其中一行表示 PENDING,另一行表示 APPROVED。我想找到重复项,然后只删除具有“旧优先级”状态的重复项,并保留具有“新优先级”状态的重复行。

例如:

以下状态优先级集是 P 列中具有不同“DisputeStatus”的可能重复行:

NULL (old)(delete)
PENDING (new)(keep)


PENDING (old)(delete)
APPROVED (new)(keep)


PENDING (old)(delete)
DENIED (new)(keep)

function removeDuplicates()
{
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test Sheet");
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  var indexOfStatusColumn = 16;
  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] == "APPROVED" && dup[indexOfStatusColumn] != "APPROVED")
          newData[dupI][indexOfStatusColumn] = "APPROVED";
        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);
}
4

1 回答 1

0

这是您解释的删除重复项的完整工作代码。它将创建一个要删除的行位置数组(满足条件的位置),并且在循环之后它将删除那些重复的行。

function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Test Sheet");
  var dataRange = sheet.getDataRange();
  var data = dataRange.getValues();
  data.shift();
  var indexOfStatusColumn = 16;
  var rowsDelete = [];

  data.forEach(function (row, rowI){
    data.forEach(function (row2, row2I) {

      if (row2[3] == row[3]) {
        if ((row[indexOfStatusColumn] == "APPROVED" && row2[indexOfStatusColumn] != "APPROVED") || (row[indexOfStatusColumn] == "PENDING" && row2[indexOfStatusColumn] == "NULL")) {
          var rowNum = Number(row2I + 2);          
          if (rowsDelete.indexOf(rowNum) == -1) {
            rowsDelete.push(rowNum);
          }
        }
      }
    })

  });

  rowsDelete.sort(function(a, b){return b-a});    // Sort the numbers in the array in descending order
  rowsDelete.forEach(function (rowNum, rowI){
    sheet.deleteRow(rowNum);  //Delete rows
  })
}
于 2019-08-02T10:15:09.237 回答