我有一段代码可以从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);
}
}
我确定这很简单,但是我还是空白。显然,我需要更多的咖啡。
答案 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公式在工作表中添加另一列。