我正在尝试找到一个 Office 脚本(最好)或 VBA 来连接列:NUMBER、RECORDS、SITE、LC、DESC,以便它成为唯一的 id。然后我想找到该唯一 id 的重复值并返回重复值并将整行复制到另一个现有的空白工作表中。
数据集
数字 | 记录 | ID1 | 网站 | LC | 描述 | ID2 |
---|---|---|---|---|---|---|
100103 | 23019 | 1 | 邮件1 | 锁定 | 房子 | A |
200103 | 23019 | 2 | 邮件2 | 码头 | 房子 | B |
100103 | 23019 | 3 | 邮件1 | 锁定 | 房子 | C |
100103 | 23019 | 4 | 邮件4 | 码头 | 房子 | D |
200103 | 23019 | 5 | 邮件2 | 码头 | 房子 | E |
100103 | 23019 | 6 | 邮件6 | 码头 | 房子 | F |
结果
数字 | 记录 | ID1 | 网站 | LC | 描述 | ID2 |
---|---|---|---|---|---|---|
100103 | 23019 | 1 | 邮件1 | 锁定 | 房子 | A |
100103 | 23019 | 3 | 邮件1 | 码头 | 房子 | C |
200103 | 23019 | 2 | 邮件2 | 锁定 | 房子 | B |
200103 | 23019 | 5 | 邮件2 | 码头 | 房子 | E |
findDuplicateRows()
中有两个参数。function main(workbook: ExcelScript.Workbook) {
const Sheet1 = workbook.getWorksheet("Sheet1");
const Sheet2 = workbook.getWorksheet("Sheet2");
const dataRng = Sheet1.getRange("A1").getSurroundingRegion()
const dataVals = dataRng.getValues();
// Extracting columns for duplicate check
const keyCols = "1|2|4|5|6"; // modify as needed
const mergedRows: string[] = [];
for (let i = 0; i < dataVals.length; i++) {
const row = dataVals[i];
const colIndex = keyCols.split("|").map(c => Number(c) - 1);
const mergedRow = colIndex.map(idx => row[idx]).join("|");
mergedRows.push(mergedRow);
}
const dupVals = findDuplicateRows(mergedRows, dataVals);
if (dupVals) {
const rowCnt = dupVals.length;
const colCnt = dupVals[0].length;
Sheet2.getRange().clear(ExcelScript.ClearApplyTo.all);
Sheet2.getRange("A1").getAbsoluteResizedRange(rowCnt, colCnt).setValues(dupVals);
} else {
console.log("No duplicated data")
}
}
function findDuplicateRows(mergedRows: string[], dataVals: (string | boolean | number)[][]): (string | boolean | number)[][] {
const duplicateRows: (string | boolean | number)[][] = [];
const foundRows: Set<string> = new Set();
for (let i = 0; i < mergedRows.length; i++) {
const row = mergedRows[i];
if (!foundRows.has(row)) {
for (let j = i + 1; j < mergedRows.length; j++) {
if (row === mergedRows[j]) {
duplicateRows.push(dataVals[i]); // Add the entire row
foundRows.add(row);
break;
}
}
} else {
duplicateRows.push(dataVals[i]);
}
}
return duplicateRows;
}