选择从 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 公式。
我有一段代码从 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 公式。