获取用户列表的 Google 个组
Getting Google Groups for a list of users
我有一个 Google Spreadsheet,里面有 2 张纸(输入和输出)。
输入 sheet 包含 A 列中的用户电子邮件地址列表(A1 是 header)。
我想遍历用户列表并提取每个用户所在的 Google 组的列表,然后将该数据转储到输出 sheet。 A 列是他们的电子邮件地址,B、C、D 等列包含他们的组。
所以像这样:
╔═══════════════════╦════════════════════╦════════════════════╦════════════════════╦════════════════════╗
║ User ║ User Groups ║ ║ ║ ║
╠═══════════════════╬════════════════════╬════════════════════╬════════════════════╬════════════════════╣
║ user@example.com ║ group1@example.com ║ group2@example.com ║ group3@example.com ║ group4@example.com ║
║ user2@example.com ║ group4@example.com ║ group2@example.com ║ ║ ║
║ user3@example.com ║ group5@example.com ║ group1@example.com ║ group3@example.com ║ ║
╚═══════════════════╩════════════════════╩════════════════════╩════════════════════╩════════════════════╝
到目前为止,这是我拥有的:
function getUserGrps(){
var ssID = "spreadsheetID"
var ss = SpreadsheetApp.getActiveSpreadsheet() || SpreadsheetApp.openById(ssID)
var inputSheet = ss.getSheetByName("Input")
var outputSheet = ss.getSheetByName("Output")
var groups = []
var userList = inputSheet.getDataRange().offset(1, 0).getValues()
userList.pop()
userList.forEach(function(user){
var response = AdminDirectory.Groups.list({userKey: user})
var userGroups = response.groups
userGroups.forEach(function(group){
Logger.log(group.name)
})
})
}
我尝试了以下方法:
userList.forEach(function(user){
var response = AdminDirectory.Groups.list({userKey: user})
var userGroups = response.groups
userGroups.forEach(function(group){
groups.push(group.name)
})
})
然后转储该输出,但它存在一些问题。
首先,它只是在 A 列中转储(作为列表)。
其次,我正在努力寻找一种方法 concat/add 将用户电子邮件地址添加到组列表中。
基本上,我脑袋放屁,任何指导将不胜感激。
有很多方法可以将一些东西添加到数组的顶部。我认为您正在尝试做的事情有助于使用 map()
and array concatenation (I used the spread syntax).
创建一个新数组
function getUserGrps(){
const ssID = "spreadsheetID";
const ss = SpreadsheetApp.getActiveSpreadsheet() || SpreadsheetApp.openById(ssID);
const inputSheet = ss.getSheetByName("Input");
const outputSheet = ss.getSheetByName("Output");
let groups = [];
const userList = inputSheet.getDataRange().offset(1, 0).getValues();
userList.pop();
let maxGroups = 0;
userList.forEach(function(user) {
const userEmail = user[0];
const response = AdminDirectory.Groups.list({userKey: userEmail});
const userGroups = response.groups ? response.groups.map(group => group.email) : [];
groups.push([userEmail, ...userGroups]);
// Set the maximum number of groups
if (userGroups.length > maxGroups)
maxGroups = userGroups.length;
});
// When printing a table with setValues(), every row needs to have the same length
const numColumns = maxGroups + 1;
const table = groups.map(function(row) {
if (row.length < numColumns) {
return [...row, ...new Array(numColumns - row.length)];
}
return row;
});
outputSheet.getRange(1, 1, table.length, table[0].length).setValues(table);
}
推荐阅读:
我有一个 Google Spreadsheet,里面有 2 张纸(输入和输出)。
输入 sheet 包含 A 列中的用户电子邮件地址列表(A1 是 header)。
我想遍历用户列表并提取每个用户所在的 Google 组的列表,然后将该数据转储到输出 sheet。 A 列是他们的电子邮件地址,B、C、D 等列包含他们的组。
所以像这样:
╔═══════════════════╦════════════════════╦════════════════════╦════════════════════╦════════════════════╗
║ User ║ User Groups ║ ║ ║ ║
╠═══════════════════╬════════════════════╬════════════════════╬════════════════════╬════════════════════╣
║ user@example.com ║ group1@example.com ║ group2@example.com ║ group3@example.com ║ group4@example.com ║
║ user2@example.com ║ group4@example.com ║ group2@example.com ║ ║ ║
║ user3@example.com ║ group5@example.com ║ group1@example.com ║ group3@example.com ║ ║
╚═══════════════════╩════════════════════╩════════════════════╩════════════════════╩════════════════════╝
到目前为止,这是我拥有的:
function getUserGrps(){
var ssID = "spreadsheetID"
var ss = SpreadsheetApp.getActiveSpreadsheet() || SpreadsheetApp.openById(ssID)
var inputSheet = ss.getSheetByName("Input")
var outputSheet = ss.getSheetByName("Output")
var groups = []
var userList = inputSheet.getDataRange().offset(1, 0).getValues()
userList.pop()
userList.forEach(function(user){
var response = AdminDirectory.Groups.list({userKey: user})
var userGroups = response.groups
userGroups.forEach(function(group){
Logger.log(group.name)
})
})
}
我尝试了以下方法:
userList.forEach(function(user){
var response = AdminDirectory.Groups.list({userKey: user})
var userGroups = response.groups
userGroups.forEach(function(group){
groups.push(group.name)
})
})
然后转储该输出,但它存在一些问题。 首先,它只是在 A 列中转储(作为列表)。 其次,我正在努力寻找一种方法 concat/add 将用户电子邮件地址添加到组列表中。
基本上,我脑袋放屁,任何指导将不胜感激。
有很多方法可以将一些东西添加到数组的顶部。我认为您正在尝试做的事情有助于使用 map()
and array concatenation (I used the spread syntax).
function getUserGrps(){
const ssID = "spreadsheetID";
const ss = SpreadsheetApp.getActiveSpreadsheet() || SpreadsheetApp.openById(ssID);
const inputSheet = ss.getSheetByName("Input");
const outputSheet = ss.getSheetByName("Output");
let groups = [];
const userList = inputSheet.getDataRange().offset(1, 0).getValues();
userList.pop();
let maxGroups = 0;
userList.forEach(function(user) {
const userEmail = user[0];
const response = AdminDirectory.Groups.list({userKey: userEmail});
const userGroups = response.groups ? response.groups.map(group => group.email) : [];
groups.push([userEmail, ...userGroups]);
// Set the maximum number of groups
if (userGroups.length > maxGroups)
maxGroups = userGroups.length;
});
// When printing a table with setValues(), every row needs to have the same length
const numColumns = maxGroups + 1;
const table = groups.map(function(row) {
if (row.length < numColumns) {
return [...row, ...new Array(numColumns - row.length)];
}
return row;
});
outputSheet.getRange(1, 1, table.length, table[0].length).setValues(table);
}