Выбор левой части массива, созданного из push.apply ([user.email, user.groupName]) - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть фрагмент кода, который извлекает список пользователей из группы Google, он просматривает группу «верхнего уровня», затем извлекает электронную почту пользователя и группу, в которой он находится. В случае вложенных групп этопроходит и снова делает то же самое.Таким образом, результат, по сути, такой:

| User (Column A)       | Group (Column B)      |
|---------------------- |-------------------    |
| userFoo@email.com     | Top Level Group       |
| userBar@email.com     | Top Level Group       |
| userQux@email.com     | Top Level Group       |
| userQuux@email.com    | Sub Level Group 1     |
| userCorge@email.com   | Sub Level Group 2     |
| userUier@email.com    | Sub Level Group 2     |
| userGrault@email.com  | Sub Level Group 3     |
| userGarply@email.com  | Sub Level Group 3     |
| userWaldo@email.com   | Sub Level Group 3     |

Там, где в группе верхнего уровня всего 3 человека, и в ней 3 подгруппы (с 1, 2 и 3 членами соответственно).

Это хранится в массиве с именем output, который создается с помощью AdminDirectory.Group.get и помещает primaryEmail и groupName в массив:
output.push.apply([user.email, user.groupName])
Позже он выгружается в лист.Что я хочу, чтобы взять раздел user.email из выходного массива и создать уникальный список из него.У меня есть функция для генерации уникального списка:

function uniqueList(value, index, self) {
  return self.indexOf(value) === index;
}

Так что мне просто нужна рука с созданием «чистого» списка (т.е. без информации об имени группы) из вывода.Конечно, я мог бы просто создать еще один массив и добавить к нему только часть user.email, но это кажется ненужным, поскольку я уже получил эту информацию.

Основной код:

function extract() {
  var masterSS = SpreadsheetApp.openById(
    "idGoesHere"
  );

  var inputSheet = masterSS.getSheetByName("Input");
  var topGroup = inputSheet.getRange("B1").getDisplayValue();
  var outputSheet = masterSS.getSheetByName("Output");
  var uniqueOutput = masterSS.getSheetByName("Unique List");

  if (topGroup.length != 0) {
    Logger.log(topGroup);
  } else {
    throw "No Group Found!";
  }

  try {
    var users = getUsersInGroup_(topGroup);
    var output = [];
            // Create the list of users + groups
    users.forEach(function(user) {
      output.push.apply([user.email, user.groupName]);
    });

    if (!outputSheet) {
      masterSS.insertSheet("Output");
    }
    SpreadsheetApp.flush();

    masterSS
      .getSheetByName("Output")
      .getRange(1, 1, output.length, output[0].length)
      .setValues(output);
    SpreadsheetApp.flush();
    spreadsheetCleanUp_;
  } catch (e) {
    Logger.log(e);
  }
}

Я уверен, что это просто, но я пробил.Очевидно, мне нужно больше кофе.

Ответы [ 2 ]

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

Быстрое и простое решение состоит в добавлении еще одного столбца на листе с УНИКАЛЬНОЙ формулой, которая ссылается на пользовательский столбец.

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

Функциональный подход к выбору части нативного Array заключается в использовании Array#map и возвращении нужного индекса:

var users = ...;
var emails = users.map(function (user) { return user[0]; });

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

function getIndex_(userObjs, index) {
  return index < 0 ? [] : userObjs.map(function (user) { return user[index]; });
}

Использование тогда будет похоже на:

var names = getIndex_(users, headers.indexOf("name"));

где headersявляется чем-то вроде ["name", "email", "lastLogin", ...] и использовался для создания объекта users.

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