在电子表格列中搜索重复的条目

时间:2016-04-26 23:15:24

标签: google-apps-script google-sheets google-spreadsheet-api

我在Google电子表格中有一些客户数据,如下所示。定期添加新条目,我想使用脚本搜索联系号码列以检查新条目的联系号码是否已存在。 此外,如果可能的话,我希望脚本能够提供某种通知,指示现有条目的行号。例如,通知可以是一个新列,它只会写出"行号"或"未找到任何条目"。

可用数据:

Contact Number   Email ID          Venue Address     Service Date
1234567890       Test1@gmail.com   cypress           21/04/2016
0123456789       Test2@gmail.com   river run drive   22/04/2016

我在寻找:

Contact Number   Email ID          Venue Address     Service Date   Duplicate entry in
1234567890       Test1@gmail.com   cypress           21/04/2016     row1
0123456789       Test2@gmail.com   river run drive   22/04/2016     no entries found

1 个答案:

答案 0 :(得分:1)

因此,您的描述意味着您希望在输入之前搜索条目。而不是搜索重复项,这意味着您的数据中已存在重复的行。我已经为你构建了一个方法。

这显示了两者的示例,这将找到重复项,或者它将通过电话号码找到条目。逻辑和自定义的其余部分取决于您。

以下是此示例表:Example Spreadsheet

修改:添加了列查找逻辑,并添加了一个按钮,您可以按此按钮查看工作表中的重复项。 注意:您必须登录Google帐户才能运行

//Entry Point
function myFunction() {
  var sheet = SpreadsheetApp.getActiveSheet(); //Get the current sheet
  var dataRange = sheet.getDataRange();
  var valuesRange = dataRange.getValues(); //The array of data on the sheet
  var columns = GetColumns(valuesRange, dataRange.getNumColumns(), 0);

  var duplicates = SearchForDuplicates(valuesRange, columns.columns['Contact Number'].index); //Search for existing duplicates
  var elementIndex = SearchForValue(valuesRange, columns.columns['Contact Number'].index, 123456789); //Search for a phone number of 123456789

  if(duplicates.length > 0){ //If there are duplicates
    var isDuplicateColumn = columns.columns['Is Duplicate'].index;
    for(var  i = 0; i < duplicates.length; i++){
      valuesRange[duplicates[i].index][isDuplicateColumn] = 'Yes'; //Assign Yes to the appropriate row
    }
    dataRange.setValues(valuesRange); //Set the spreadsheets values to that of the modified valuesRange
  }  
  Logger.log(duplicates);
  Logger.log(elementIndex);
}

//Searches an array for duplicate entries
function SearchForDuplicates(array, columnIndex){
  var uniqueElements = {};
  var duplicates = [];
  for(var  i = 0; i < array.length; i++){
    if(typeof uniqueElements[array[i][columnIndex]] === 'undefined'){ 
      uniqueElements[array[i][columnIndex]] = 0;  //If the element does not yet exist in this object, add it
    } else {
      duplicates.push({row: array[i], index: i}); //If the element does exist, it's a duplicate
    }
  }
  return duplicates;
}

//Searches an array for a value
function SearchForValue(array, columnIndex, value){
  for(var  i = 0; i < array.length; i++){
    if(array[i][columnIndex] == value){
      return i;  //Element found, return index
    }
  }
  return -1; //No element found, return -1
}

//Gets a columns object for the sheet for easy indexing
function GetColumns(valuesRange, columnCount, rowIndex)
{
  var columns = {
    columns: {},
    length: 0
  }

  Logger.log("Populating columns...");
  for(var i = 0; i < columnCount; i++)
  {
    if(valuesRange[0][i] !== ''){
      columns.columns[valuesRange[0][i]] = {index: i ,value: valuesRange[0][i]};
      columns.length++;      
    }
  }  
  return columns;
}