Удалить дубликаты, если значение в отдельном столбце отличается - PullRequest
1 голос
/ 02 апреля 2020

Я пытаюсь составить список людей, которым нужно отправить письмо. Я не хочу отправлять им второе письмо, но в то же время я не хочу удалять их из этого списка, если они не являются действительно дубликатами.

Возьмите этот пример:

Acct    RandomCol1  RandomCol2  RandomCol3  Address
00001   blahblah    blahblah    blahblah    123 address drive
12345   blahblah    blahblah    blahblah    345 address drive
00001   blahblah    blahblah    blahblah    123 address drive
67890   blahblah    blahblah    blahblah    567 address drive
12345   blahblah    blahblah    blahblah    890 address drive

Обратите внимание, что в Acct 00001 есть две строки, в которых адрес совпадает. Не нужно отправлять письмо на этот адрес дважды, чтобы мы могли удалить одну строку. Acct 12345, однако не имеет соответствующего адреса. Это должно быть сохранено. Конечный результат должен выглядеть следующим образом:

Acct    RandomCol1  RandomCol2  RandomCol3  Address
00001   blahblah    blahblah    blahblah    123 address drive
12345   blahblah    blahblah    blahblah    345 address drive
67890   blahblah    blahblah    blahblah    567 address drive
12345   blahblah    blahblah    blahblah    890 address drive

Я видел множество постов с решениями по удалению дубликатов в массиве на основе одного столбца, но не видел ни одного, чтобы выполнить sh выше. Кроме того, многие решения, которые я не думаю, будут подходить для строк 100K.

Я задал другой вопрос здесь ранее, который похож по своей природе, но у меня есть проблема преобразования этого в решение для вышеупомянутого сценария, где столбцы не расположены рядом друг с другом. Мне очень понравилась производительность этого решения, однако мне сказали, что его неодобрительно просить внести изменения в это решение по тому же вопросу.

Я пытался что-то соединить, но признаюсь не иметь опыта работы с объектами или уменьшить.

function removeDupsWDiffAddr(sh, colWDupValuesIndex, colToComp1Index){ //Master with v8 runtime
/**
 * @param {sheet}  sh - Sheet where duplicates will be removed
 * @param {number} colWDupValuesIndex - Col Index where duplicate values should be.
 * @param {number} colToComp1Index - Col Index where criteria should be met
**/
  let rg = sh.getRange(2, 1, sh.getLastRow() - 1, sh.getLastCol());
  let initDataSz = rg.getNumRows();
  let values = rg.getValues();
  let colWDupValuesArr = sh.getRange(2, colWDupValuesIndex, initDataSz, 1).getValues();
  let colToComp1Arr = sh.getRange(2, colToComp1Index, initDataSz, 1).getValues();
  rg.clearContent(); //Clear the sheet after grabbing everything you need from it

  let out = Object.entries(
    values.reduce((obj, [acctNum, address]) => {
      let compare = (obj[acctNum] = obj[acctNum] || Infinity);
      if (compare == address) {
        obj[acctNum] = address;
      }
      return obj;
    }, {})
  ).map(e => e.reverse());


  let diffAddrDupsCount = initDataSz - out.length;
  let destRange = sh.getRange(2, 1, out.length, out[0].length);
  destRange.setValues(out);

  return diffAddrDupsCount;
}

Я предполагаю, что эта строка values.reduce((obj, [acctNum, address]) потребует от меня добавления каждого столбца, но нет гарантии, что структура столбцов или количество столбцов останутся прежними, следовательно, я смогу обеспечить индекс столбца .

Дополнительные примечания:

  • Более 20 столбцов. Фактически, acctnum и address находятся в столбцах D и L соответственно. Мне нужно было бы предоставить индекс столбца для них.
  • Я использую V8.

1 Ответ

2 голосов
/ 02 апреля 2020
  • Вы хотите удалить дублирующиеся строки, проверив столбцы «D» и «L».
  • Вы хотите перезаписать лист новыми значениями.
  • Требуется чтобы добиться этого с помощью Google Apps Script.

Если мое понимание верно, как насчет этого ответа? Пожалуйста, подумайте об этом как об одном из нескольких возможных ответов.

В этом ответе я использовал removeDuplicates. Я думал, что когда этот метод используется, он может стать простым сценарием.

Пример сценария:

function myFunction() {
  const sheetName = "###";  // Please set the sheet name.

  SpreadsheetApp
    .getActiveSpreadsheet()
    .getSheetByName(sheetName)
    .getDataRange()
    .removeDuplicates([4, 12]);
}

Ссылка:

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