Все прекрасно знают как сделать из обычного массива с набором повторяющихся элементов массив без повторов, например:
function uniqArr(){
const arr = ['a', 'b', 'c', 'd', 'e', 'a', 1, 2, 3, 1, 4, 5,]
const unArr =[...new Set(arr)]
console.log(unArr)
}
консоль выдаст [ 'a', 'b', 'c', 'd', 'e', 1, 2, 3, 4, 5 ]
Однако, если забирать в массив таблицу из гугл-листов то массив будет представлять из себя массив массивов
Практический пример
К примеру у меня есть некий справочник по людям и их телефонных номерах.
В этом справочнике есть повторы.
Справочник необходимо обработать, убрав повторы, где по всем трем полям есть полное совпадение.
Если вывести массив в консоль, вид будет следующим:
Обработать такой массив массивов стандартным способом через new Set()
невозможно.
Однако, это можно сделать через промежуточный объект:
function uniq(){
const ws = SpreadsheetApp.getActiveSpreadsheet()
const ss = ws.getSheets()[0]
const mainArr = ss.getDataRange().getValues()
console.log(mainArr)
const result = {};
for (const row of mainArr) {
const check_name = row[0] + row[1] + row[2];
if (!result[check_name]) {
result[check_name] = row;
}
}
console.log(result);
console.log(Object.values(result));
}
Что здесь происходит?
const ws = SpreadsheetApp.getActiveSpreadsheet()
const ss = ws.getSheets()[0]
const mainArr = ss.getDataRange().getValues()
ws.getSheets()[0]
— обращение к первому листу текущей книги, где хранится телефонный справочник. Сделано ради разнообразия кода, можно так же получать доступ через имя листа.
const result = {};
for (const row of mainArr) {
const check_name = row[0] + row[1] + row[2];
if (!result[check_name]) {
result[check_name] = row;
}
}
const result = {};
— создаю пустой объект, который в дальнейшем будет наполняться уникальными записями
const check_name = row[0] + row[1] + row[2];
— ключ для объекта, который является «связкой трех полей» и служит для проверки уникальности.
if (!result[check_name]) {
— если в объекте такого ключа нет, то:
result[check_name] = row;
— наполнение объекта. Ключ = значение, которое как раз и есть элемент (массив) основного массива.
Результат
Когда for of
пройдется по всему массиву mainArr
и наполнит объект result
неповторяющимися записями, его совершенно спокойно можно возвращать в гугл таблицу через Object.values(result)