突出显示重复项并复制到新的 sheet

Highlight duplicates and copy to new sheet

我有大量 sheet 服务器名称,约 12,000 行。我需要突出显示任何重复的服务器名称,然后将它们复制到新的 sheet。我有一个脚本来突出显示单元格,效果很好(谢谢 Kurt Kaiser)。但是,我不知道如何将重复项(所有实例)写入新的 sheet。这是突出显示重复项的代码片段。

// Highlight all instances of duplicate values in a column
function highlightColumnDuplicates(indexes) {
  var column = 1;
  for (n = 0; n < indexes.length; n++) {
    sheet.getRange(indexes[n] + 1, column).setBackground("yellow");
  }
}

如有任何帮助,我们将不胜感激。

您不需要使用 Google 应用脚本来为新 sheet 创建重复项列表。此函数将对 a 列中的所有值执行此操作。 =Unique(filter(List!A:A,not(isblank(List!A:A)),Countif(List!A:A,List!A1:A)>1))

You can see an example here.

但是,如果您确实需要一个应用程序脚本解决方案,下面的代码也应该有效。同一示例 google sheet 也在不同的选项卡上显示了这一点。

/**
 * @OnlyCurrentDoc
 */
function listDuplicates(someRange) {
  var firstList = someRange;
  var singleList = [];
  var dupList = [];

  for (var i = 0; i < firstList.length; i++) {
    var aRow = firstList[i];
    for (var j = 0; j < aRow.length; j++) {
      var theOutput = aRow[j];
      if (theOutput != '') {
        if (singleList.includes(theOutput)) {
            dupList.push(theOutput);
        } else {
            singleList.push(theOutput);
        }
      }
    }
  }
  return Array.from(new Set(dupList));
}

以防万一这里有另一个解决方案:

function main() {
  const duplicates = highlightColumnDuplicates();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dest_sheet = ss.getSheetByName('Duplicates') || ss.insertSheet('Duplicates');
  const dest_range = dest_sheet.getRange(1,1,duplicates.length,1);
  dest_range.setValues(duplicates.map(x=>[x]));
}

function highlightColumnDuplicates() {

  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange("A1:A" + sheet.getLastRow());
  const data  = range.getValues().flat();  

  // returns true if 'x' is repeated in 'arr'
  const is_duplicate = (x,arr) => arr.indexOf(x) != arr.lastIndexOf(x);

  // get indexes (row numbers) of duplicates in data (in the column)
  const indexes = data.map((x,i) => is_duplicate(x,data) ? i : '').filter(String);

  // change backgrounds like a sir
  const colors = range.getBackgrounds();
  indexes.forEach(x => colors[x][0] = "yellow");
  range.setBackgrounds(colors);

  // get duplicates from the data via indexes
  const duplicates = Array.from(new Set(indexes.map(x => data[x])));  

  return duplicates;
  
}

它将为所有在 A 列中当前 sheet 上有重复项的单元格制作黄色背景,并复制名称为 Duplicates 的 sheet 上的重复项。


更新

如果您需要获取完整的行和重复的所有实例,这里是修改后的代码:

function main() {
  const duplicates = highlightColumnDuplicates();
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  const dest_sheet = ss.getSheetByName('Duplicates') || ss.insertSheet('Duplicates');
  const dest_range = dest_sheet.getRange(1,1,duplicates.length,duplicates[0].length);
  dest_range.setValues(duplicates);
}

function highlightColumnDuplicates() {

  const sheet = SpreadsheetApp.getActiveSheet();
  const range = sheet.getRange('A1:A' + sheet.getLastRow());
  const data  = range.getValues().flat();  

  // returns true if 'x' is repeated in 'arr'
  const is_duplicate = (x,arr) => arr.indexOf(x) != arr.lastIndexOf(x);

  // get indexes (row numbers) of duplicates in data (in the column)
  const indexes = data.map((x,i) => is_duplicate(x,data) ? i : '').filter(String);

  // change backgrounds like a sir
  const colors = range.getBackgrounds();
  indexes.forEach(x => colors[x][0] = "yellow");
  // range.setBackgrounds(colors);

  // get duplicates from the data via indexes
  const data_all  = sheet.getDataRange().getValues();
  const duplicates = indexes.map(x => data_all[x]);

  return duplicates;  
}