Попытка перекрестной проверки двух диапазонов в Google Sheets с помощью скрипта - PullRequest
0 голосов
/ 13 декабря 2018

В настоящее время я пытаюсь написать скрипт для сравнения двух диапазонов в Google Sheets.Один - это список адресов электронной почты для контакта (sht1), а другой - список адресов электронной почты в черном списке (sht2).Я хочу автоматизировать скрипт, который будет сравнивать каждое письмо в списке контактов в sht1 со ВСЕМИ письмами в черном списке sht2.Если значение в sht1 в точке [i] совпадает с любым из значений в черном списке в sht2 [j], от sht2 [0] до sht2 [length], это автоматически приведет к удалению строки в sht1 в [i].

Однако скрипт не работает.Я продолжаю получать сообщение об ошибке «диапазон за пределами». Я пытался изменить условия i с if (var i = 0; i

. Любая помощь будет принята с благодарностью.

function DeleteDupes()
{
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sht1=ss.getSheetByName('Email List All');
  var dd = SpreadsheetApp.openByUrl('noneofyourbusiness')
  var sht2=dd.getSheetByName('Sheet1');
  var rng1=sht1.getRange('A:A');
  var rng2=sht2.getRange('A:A');
  var rng1A=rng1.getValues();
  var rng2A=rng2.getValues();
  for(var i=rng1A.length;i>=0;i--)
  {
    for(var j=0;j<=rng2A.length;j++)
    {
      if(rng1A[i]==rng2A[j]);
      sht1.deleteRow(i-1);
      break;
    }
  }
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018
function DeleteDupes(){
  var ss=SpreadsheetApp.getActiveSpreadsheet();
  var sht1=ss.getSheetByName('Email List All');
  var dd = SpreadsheetApp.openByUrl('noneofyourbusiness')
  var sht2=dd.getSheetByName('Sheet1');
  var rng1=sht1.getRange('A:A');
  var rng2=sht2.getRange('A:A');

  // Code changes begin here:
  var rng1A=formatRangeValues(rng1);
  var rng2A=formatRangeValues(rng2);

  // Keep only the emails in `rng1A` that are not in `rng2A`
  var filteredEmails = rng1A.filter(function(email){
    return this.indexOf(email) === -1;
  }, rng2A);

  // Remove all emails in `rng1` in preparation of inserting filtered list
  rng1.clearContent();

  // Protect against an empty `filteredEmails` array
  if(filteredEmails.length === 0) 
    return;

  // Convert `filteredEmails` back to a 2D Range 
  // and insert back into Column A
  sht1
    .getRange(1, 1, filteredEmails.length)
    .setValues(
      filteredEmails.map(function(e){ 
        return [e] ;
      })
    );
}

// Filter out blank elements. 
// reduce{concat} flattens the array
function formatRangeValues(range){
  return range
    .getValues()
    .filter(String)
    .reduce(function(a,b){ 
       return a.concat(b) 
    }, []);
}

Это удалит все сообщения электронной почты на sht1, которые находятся на sht2.Он работает, перенося диапазон sht1 в память и преобразовав его в массив значений.Затем он фильтрует значения и вставляет их обратно в sht1.

Существует два основных преимущества манипулирования данными в JavaScript, а не в электронной таблице.Во-первых, это будет быстрее.Чтение и запись в документ электронной таблицы обходятся дорого.Таким образом, мы можем пакетировать их, а не делать их по отдельности.Во-вторых, это безопаснее, поскольку он манипулирует только клетками, о которых идет речьНам не нужно беспокоиться о побочных эффектах (таких как удаление строки, когда когда-нибудь могут быть использованы другие столбцы).

0 голосов
/ 13 декабря 2018

Удаление элементов в черном списке

Попробуйте:

function delItemsOnBlacklist() {
  var ss=SpreadsheetApp.getActive();
  var sh1=ss.getSheetByName('Contacts');
  var sh2=ss.getSheetByName('BlackList')
  var rg1=sh1.getRange(1,1,sh1.getLastRow(),1);
  var rg2=sh2.getRange(1,1,sh2.getLastRow(),1);
  var vA=rg1.getValues();
  var vB=rg2.getValues();
  var vBlackList=[];
  var d=0;
  for(var i=0;i<vB.length;i++){
    vBlackList.push(vB[i][0]);
  }
  for(var i=0;i<vA.length;i++)
  {
    if(vBlackList.indexOf(vA[i][0])>-1){
      sh1.deleteRow(i-d+1);
      d++;
    }
  }
}

Я немного изменил имена файлов и описания диапазонов, поэтому убедитесь, что вы вносите соответствующие изменения.Я предпочитаю помещать черный список в массив.Это только кажется мне более аккуратным.Если вы отслеживаете удаленные элементы, как в «d», и добавляете их в deleteRow, вы можете увеличивать цикл, который, как мне кажется, был бы более полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...