根据特定列和路径将重复项复制到另一张纸

问题描述 投票:0回答:1

我正在尝试找到一个 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

这是解决问题的帖子,但现在我正在尝试找到一种方法来连接特定列,然后返回整行的重复值

excel vba office-scripts
1个回答
0
投票
  • 主要逻辑与之前的答案相同。
  • 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.