【问题标题】:Google Script App Delete Duplicate Rows with a Specific Value in Specific Column in Google SheetGoogle Script App删除Google工作表中特定列中具有特定值的重复行
【发布时间】:2018-10-26 17:00:37
【问题描述】:

我有一个谷歌表格,人们在其中提交他们正在处理的任务,他们将提交状态更新,比如说任务 A,任务 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);
}

【问题讨论】:

  • 能否分享您的电子表格,我很乐意为您提供帮助。
  • @JSmith link 谢谢!
  • 刚刚要求您访问。

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


【解决方案1】:

我会试试的

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()loop 效率更高
  2. 通过返回 false 来打破循环以避免解析到您所有的 newDatauseless
  3. 当我找到重复项时,我会执行其中一些操作
    1. 检查Complete 上的重复项是否是data 而不是newData,如果是的话
    2. newData中的值更改为“完成”,这样它将保持完整状态(如果两行上的数据不同,可能会扭曲数据,请小心)。
  4. 还可以使用范围内的clearContent() 来避免删除工作表的所有内容,而只删除其中的特定部分。在这里我已经重建它以保留标题

参考文献

forEach()

Tanaike benchmark

clearContent()

【讨论】:

  • 感谢您的帮助,不幸的是,这似乎不起作用。这是电子表格link。我希望这有帮助!非常感谢您的帮助!
  • @RickyAdams 太好了!很高兴它有帮助。谢谢
  • 我刚刚尝试再次运行它,但由于某种原因它仍然没有删除正在进行的行。相反,它正在删除具有完整状态的重复任务。它还复制第一行并将其插入第二行。任何想法为什么会这样?对不起!谢谢!
  • @RickyAdams 向您重新发送了访问请求
猜你喜欢
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 2020-11-15
相关资源
最近更新 更多