突出显示重复内容并复制到新表格。

3

我有一个服务器名称的大表格,大约有12,000行。 我需要突出显示任何重复的服务器名称,然后将它们复制到一个新的工作表中。我有一个突出显示单元格的脚本,它非常好用(感谢Kurt Kaiser)。但是,我无法弄清楚如何将重复项(所有实例)写入新工作表中。 这是突出显示重复项的代码片段。

// 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");
  }
}

希望能得到任何帮助。


不确定为什么代码格式化不正确,抱歉。 - Bob Morgan AZ-Phoenix
以下是有关编程的内容,请将其从英语翻译成中文。仅返回已翻译的文本:(对于格式化:您只需要在代码部分之前添加额外的空行。) - andrewJames
尽管如此,如果有数百个重复项,我怀疑脚本可能会运行得非常慢。它为每个重复项设置背景。但是,使用setBackgrounds()方法一次性为范围(列)设置所有背景将更快。 - Yuri Khristich
虽然这可能会降低性能,但您可以使用条件格式来突出显示重复项。如果单元格为A1,则使用此规则,然后应用于整个列。 =countif(A:A,A1)>1 - pgSystemTester
2个回答

2
你不需要使用Google App Scripts来创建一个将重复项列表复制到新工作表的脚本。这个函数可以针对A列中的所有值执行此操作:=Unique(filter(List!A:A,not(isblank(List!A:A)),Countif(List!A:A,List!A1:A)>1))你可以在这里查看示例。 但是,如果你确实想要一个App Scripts解决方案,下面的代码也应该可以工作。同样的示例谷歌表格也在不同的选项卡上展示了这一点。
/**
 * @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));
}

2

如果有需要,这里还有另一种解决方案:

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中,为所有包含重复项的单元格设置黄色背景,并将这些重复项复制到名为Duplicates的工作表中。


更新

如果您需要获取完整行和所有重复项的实例,则可以使用以下修改后的代码:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接