删除多个工作表中的重复项

时间:2019-10-11 11:46:58

标签: javascript google-apps-script google-sheets

我想删除2张不同纸上的重复项。

我有活动的工作表,我想删除工作表“黑名单”中已经存在的重复项。我想同时对A列和B列(或仅对整个工作表中的任何值)都运行此过程。当发现重复项时,我想保留该行,但将值替换为”(例如,一个空单元格)。

我有一个工作版本,我将其拼凑在一起,但仅适用于活动工作表。

这是我使用的findDuplicate函数,我留在那儿的removeDuplicate函数不会弄乱任何东西:)

// this is a Google Apps Script project

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActive();
  var menuItems = [
    { name: 'Find duplicates...', functionName: 'findDuplicate' },
    { name: 'Remove duplicates...', functionName: 'removeDuplicate' }
  ];
  spreadsheet.addMenu('Duplicates', menuItems);
}

function removeDuplicate() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

  var rowNum = range.getRow();
  var columnNum = range.getColumn();
  var columnLength = data[0].length;

  var uniqueData = [];
  var duplicateData = [];

  // iterate through each 'row' of the selected range
  // x is
  // y is
  var x = 0;
  var y = data.length;

  // when row is
  while (x < y) {
    var row = data[x];
    var duplicate = false;

    // iterate through the uniqueData array to see if 'row' already exists
    for (var j = 0; j < uniqueData.length; j++) {
      if (row.join() == uniqueData[j].join()) {
        // if there is a duplicate, delete the 'row' from the sheet and add it to the duplicateData array
        duplicate = true;
        var duplicateRange = sheet.getRange(
          rowNum + x,
          columnNum,
          1,
          columnLength
        );
        duplicateRange.deleteCells(SpreadsheetApp.Dimension.ROWS);
        duplicateData.push(row);

        // rows shift up by one when duplicate is deleted
        // in effect, it skips a line
        // so we need to decrement x to stay in the same line
        x--;
        y--;
        range = sheet.getActiveRange();
        data = range.getValues();
        // return;
      }
    }

    // if there are no duplicates, add 'row' to the uniqueData array
    if (!duplicate) {
      uniqueData.push(row);
    }
    x++;
  }

}

function findDuplicate() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

  var rowNum = range.getRow();
  var columnNum = range.getColumn();
  var columnLength = data[0].length;

  var uniqueData = [];

  // iterate through each 'row' of the selected range
  for (var i = 0; i < data.length; i++) {
    var row = data[i];
    var duplicate = false;

    // iterate through the uniqueData array to see if 'row' already exists
    for (var j = 0; j < uniqueData.length; j++) {
      if (row.join() == uniqueData[j].join()) {
        // if there is a duplicate, highlight the 'row' from the sheet
        duplicate = true;
        var duplicateRange = sheet.getRange(
          rowNum + i,
          columnNum,
          1,
          columnLength
        );
        duplicateRange.setValue('');
      }
    }

    // if there are no duplicates, add 'row' to the uniqueData array
    if (!duplicate) {
      uniqueData.push(row);
    }
  }
}

非常感谢您的帮助!我已经呆了几个小时了,以为我应该向专家咨询一下:)

1 个答案:

答案 0 :(得分:1)

removeDuplicate和findDuplicate函数的第一行似乎确实表明您引用了活动电子表格/工作表/范围

  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getActiveRange();
  var data = range.getValues();

如果要对给定的电子表格/工作表/范围(而不是活动的)使用相同的功能,则需要使用getActiveXXX()以外的其他功能。

例如,要获取名为“ Blacklist”的工作表,应使用 sheet = spreadsheet.getSheetByName("Blacklist") (另请参见https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getsheetbynamename

如果要访问与活动范围不同的特定范围,则应使用getRange方法(另请参见https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getrangea1notation) 请注意,getRange方法可以以不同的方式使用,例如 getRange("A1:D4")getRange(1, 1, 3, 3)(参数分别是startRow,startColumn,numRows,numColumns)

此外,如果您不想对2列的最后一行进行硬编码,则很可能需要此函数才能在代码中找到最后一行: https://developers.google.com/apps-script/reference/spreadsheet/spreadsheet#getlastrow (那里还有一个示例,展示了如何结合使用getRange()和getLastRow()。)

我希望这会帮助您进一步发展。 请注意,我没有检查您的其余代码,只是假设您的重复数据删除逻辑可以如您在评论中提到的那样正常工作。

祝你好运!