Массивы в гугл скриптах — уникальные записи массива из гугл таблиц

Все прекрасно знают как сделать из обычного массива с набором повторяющихся элементов массив без повторов, например:

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)

Добавить комментарий