首页 > 解决方案 > 使用 Google App Scripts 删除重复行

问题描述

我有一个带有两个标签的 Google 表格,我想检查行并从中删除重复项。但是,两者的要求略有不同。

在提交匹配选项卡上,我将数据从 Google 表单导入到 A:C 列中,其中表单提交的脚本然后从 API 获取数据并填充 D:J,最后,K:M 通过脚本插入了一个自定义公式。数据范围为 A2:M

我遇到的问题是a)我对所有这些都是新手,b)当我尝试删除重复项时(人们可以从表单中提交两次相同的东西)我找到的唯一解决方案复制了所有行,删除重复项并再次粘贴唯一行,因此我丢失了公式。

我让脚本检查 B 列(这只是一个来自 AZ 的字母)和 C 列(唯一 ID)是否存在重复项,例如,如果第 2 行和第 3 行在 B 列中有“A”,在 C 列中有“123456”,那么这是重复的。作为参考,这是我的工作:

function removeDuplicates() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var data = sheet.getDataRange().getValues();
  var newData = [];
  for (var i in data) {
    var row = data[i];
    var duplicate = false;
    for (var j in newData) {
      if(row[2] == newData[j][2] && row[3] == newData[j][3]){
        duplicate = true;
      }
    }
    if (!duplicate) {
      newData.push(row);
    }
  }
  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
}

我需要做的是脚本检查基于列 B 和 C 中的数据的重复行并将其删除,但必须保留 K:M 中的公式。通过仅从 A:J 中删除数据或通过其他方法。

此外,我假设我需要确保这仅在“submittedMatches”选项卡上运行,而不是在工作表上的其他选项卡上运行。

标签: javascriptgoogle-apps-script

解决方案


我解决了这个问题。对不起。经过数小时的尝试后,您最终寻求帮助的方式总是如此。

我在 B 和 C 上设置了条件格式: =countifs($B$1:$B1,$B1,$C$1:$C1,$C1)>1

我将背景颜色设置为#fefefe,并将字体设置为红色和粗体。然后我添加了以下脚本来检查具有#fefefe 背景的单元格并将其删除。

function deleteDuplicateMatches() {
  var spreadsheet = SpreadsheetApp.getActive();
  var sheet = spreadsheet.getSheetByName('submittedMatches');
  
  //Only get range with data (non-empty cells)
  var firstCol = sheet.getDataRange();

  //Save data validation rules based on the first row
  var dataValRules = sheet.getRange('A2:M2').getDataValidations();

  var maxRow = firstCol.getNumRows();
  for (var row=1; row<=maxRow; row++){

    //Delete row with background color of gray #fefefe
    if(sheet.getRange(row,1).getBackground() == "#fefefe"){

      sheet.deleteRow(row);

      //since current row was deleted adjust current data set
      //this will handle scenarios with succeeding duplicates
      row--;
      maxRow--;

      //insert new row at the end and set data validation rules
      sheet.insertRowAfter(maxRow);
      sheet.getRange(maxRow,1,1,13).setDataValidations(dataValRules);
    }
  }
};

推荐阅读