【问题标题】:Google Script App Delete Duplicate Rows but Keep one with Specific StatusGoogle Script App 删除重复的行但保留具有特定状态的行
【发布时间】:2019-08-01 14:49:43
【问题描述】:

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

我在“测试表”表的 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);
}

【问题讨论】:

  • “我正在查看此帖子,它与我正在为我的项目做的事情密切相关。”请提供帖子的链接。

标签: google-apps-script google-sheets


【解决方案1】:

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

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
  })
}

【讨论】:

  • 你好,这个脚本保持整个页面不变。好消息是没有弹出错误。
  • 代码正在将重复项与 D 列进行比较。如果您在 P 列中有状态(我认为它在 Q 中),请将 indexOfStatusColumn 更改为 15
猜你喜欢
  • 1970-01-01
  • 2016-10-13
  • 2019-10-27
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2011-08-26
相关资源
最近更新 更多