Я пытаюсь составить список людей, которым нужно отправить письмо. Я не хочу отправлять им второе письмо, но в то же время я не хочу удалять их из этого списка, если они не являются действительно дубликатами.
Возьмите этот пример:
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.