选择从 push.apply([user.email, user.groupName]) 构建的数组的左侧部分

Selecting the left part of an array built from push.apply([user.email, user.groupName])

我有一段代码从 Google 组中提取用户列表,它查看 'top level' 组,然后提取用户电子邮件和他们所在的组。在对于嵌套组,它遍历并再次执行相同的操作。所以输出基本上是这样的:

| 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人)。

这存储在一个名为输出的数组中,该数组是通过使用 AdminDirectory.Group.get 并将 primaryEmail 和 groupName 推送到数组构建的:
output.push.apply([user.email, user.groupName])
这稍后被转储到 sheet。 我想要从输出数组中获取 user.email 部分,并从中创建一个唯一列表。我有一个生成唯一列表的函数:

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

所以我只需要帮助从输出创建一个 'clean' 列表(意思是没有组名信息)。当然,我可以创建另一个数组并仅将 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);
  }
}

我相信这很简单,但我一头雾水。显然,我需要更多咖啡。

选择一部分原生 Array 的功能方法是使用 Array#map 和 return 所需的索引:

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 对象。

一种快速简便的解决方案是在 sheet 中添加另一列,其中包含引用用户列的 UNIQUE 公式。