突出显示重复项并复制到新的 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))
但是,如果您确实需要一个应用程序脚本解决方案,下面的代码也应该有效。同一示例 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;
}
我有大量 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))
但是,如果您确实需要一个应用程序脚本解决方案,下面的代码也应该有效。同一示例 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;
}