Google表格脚本:如何仅比较一列以删除重复项

时间:2019-07-15 01:55:33

标签: google-apps-script google-sheets

此示例表中有4个重复项(第2-5行):https://docs.google.com/spreadsheets/d/1CMR9TjtxIGF7QDFBEMBSbAcd71neSjteINvmeuvZ3lo/edit#gid=0

我只想比较column BLink)删除,但是此脚本比较一行中的所有单元格

function removeDuplicates() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Combined');
  const data = sheet.getDataRange().getValues();
  const numRows = data.length;
  const newData = [];
  const seen = {};

  for (var i = 0, row, key; i < numRows && (row = data[i]); i++) {
    key = JSON.stringify(row);
    if (key in seen) {
      continue;
    }
    seen[key] = true;
    newData.push(row);
  }

  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);

}

我怎样才能比较column B来删除重复对象,而又不会在写回工作表时丢失信息呢?

1 个答案:

答案 0 :(得分:2)

  • 您要删除列“ B”的值重复的行。
  • 您要清除工作表的所有内容并覆盖没有重复值的新值。
  • 您想使用Google Apps脚本实现这一目标。

如果我的理解是正确的,那么该修改如何?请认为这只是几个答案之一。

模式1:

修改脚本后,如何进行修改?

从:
for (var i = 0, row, key; i < numRows && (row = data[i]); i++) {
  key = JSON.stringify(row);
  if (key in seen) {
    continue;
  }
  seen[key] = true;
  newData.push(row);
}
至:
for (var i = 0, row, key; i < numRows && (row = data[i][1]); i++) { // Modified
  if (row in seen) { // Modified
    continue;
  }
  seen[row] = true; // Modified
  newData.push(data[i]); // Modified
}

模式2:

与其他模式一样,修改后的脚本又如何呢?

function removeDuplicates_modified() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Combined');
  const data = sheet.getDataRange().getValues();

  var temp = {}; // Added
  var newData = data.reduce(function(ar, e) { // Added
    if (!temp[e[1]]) {
      ar.push(e);
      temp[e[1]] = e[1];
    }
    return ar;
  }, []);

  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

注意:

  • 在示例电子表格中,“ D”和“ B”列的值不重复,而“ B”列的值重复。如果您想处理此事,请告诉我。

参考:

如果我误解了您的问题,而这不是您想要的结果,我深表歉意。

已添加:

模式3:

修改脚本后,我注意到了更简单的修改。请检查以下修改。

从:
key = JSON.stringify(row);
至:
key = row[1];

模式4:

使用filter时,此修改如何?

function removeDuplicates_modified() {
  const sheet = SpreadsheetApp.getActive().getSheetByName('Combined');
  const data = sheet.getDataRange().getValues();

  var temp = {}; // Added
  var newData = data.filter(function(e) { // Added
    if (!temp[e[1]]) {
      temp[e[1]] = e[1];
      return true;
    }
    return false;
  });

  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

参考: