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

时间:2018-12-24 10:02:20

标签: javascript google-apps-script ecmascript-5

我有一段代码可以从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 :(得分:1)

选择本地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对象。

答案 1 :(得分:1)

一种快速简便的解决方案是使用引用用户列的UNIQUE公式在工作表中添加另一列。