【问题标题】:Get users by Department from Admin Directory API using Google Apps Script使用 Google Apps 脚本从 Admin Directory API 按部门获取用户
【发布时间】:2018-09-16 09:40:39
【问题描述】:

我有以下(大部分)使用 Admin Directory API 的工作脚本。但是,我不想提取整个域 - 我只想提取特定部门的信息。

function listAllUsers() {
  var ss = SpreadsheetApp.getActive();
  var pageToken, page, count = 0;
  var listArray = [];
  listArray.push(['full name', 'first name', 'last name', 'email', 'department', 'ID'])
  do {
    page = AdminDirectory.Users.list({
      domain: 'example.co.uk',
      orderBy: 'givenName',
      maxResults: 100,
      pageToken: pageToken
    });
    var users = page.users;
    if (users) {
      for (var i = 0; i < users.length; i++) {
        var user = users[i];
        listArray.push([user.name.fullName, user.name.givenName, user.name.familyName, user.primaryEmail, user.organizations, user.id,]);
      }
    }
    pageToken = page.nextPageToken;
    break; // This means you only get one page
  } while (pageToken);
  try {
    var outputSheet = ss.getSheetByName('allMembers');
    outputSheet.getDataRange();
  } catch(err) {
    var outputSheet = ss.insertSheet('allMembers', 2);
  }
  outputSheet.getDataRange().clear();
  outputSheet.getRange(1, 1, listArray.length, listArray[0].length).setValues(listArray);
  outputSheet.getRange(1, 6, outputSheet.getLastRow(), 4).setHorizontalAlignment("center");
  outputSheet.getRange(1, 1, outputSheet.getLastRow(), 1).setHorizontalAlignment("center");
  var width = [150, 150, 180, 250, 250, 200];
  formatSheet(outputSheet, width);
}

我尝试使用 user.organization[].domain 过滤到域,但收到错误消息。我将参数user.organizations 更改为user.organizations[].department,如in the Admin SDK reference 所述。

这最初抛出了一个SyntaxError,当更改为user.organizations[0].department时它抛出了错误消息:

TypeError:无法从未定义中读取属性“0”

我完全省略了括号并使用了user.organizations.department,但是得到了:

TypeError:无法从未定义中读取属性“部门”

另外,如果可能的话,我想单独列出部门和职位。目前,它以这种格式导出信息:

{customType=work, name=, location=002, title=Technical Support Manager, department=Technical Support, primary=true}

当前显示:

我想要的输出格式:

【问题讨论】:

  • 如果您尝试以一种方式执行此操作并收到错误消息,那么共享所述代码和所述错误消息是否没有意义?您是否尝试过不同的查询?另外,您的部门和职称已经是不同的值,所以我不确定您遇到了什么困难。
  • 已更新帖子以显示我尝试过的内容并提供一些屏幕截图以更好地解释事情。

标签: google-apps-script google-sheets google-admin-sdk


【解决方案1】:

您收到这些错误是因为您域中的某些用户没有部门/职务用户属性。

添加 2 个变量和 try.. catch 块应该可以让代码按预期工作。

这是更新后的代码:

function listAllUsers() {
    var ss = SpreadsheetApp.getActive();
    var pageToken,
    page,
    count = 0;
    var listArray = [];
    listArray.push(['full name', 'first name', 'last name', 'email', 'department', 'title', 'ID'])
    do {
        page = AdminDirectory.Users.list({
                domain : 'example.com',
                orderBy : 'givenName',
                pageToken : pageToken
            });
        var users = page.users;
        if (users) {
            for (var i = 0; i < users.length; i++) {
                var user = users[i];
                var department,
                title; // Addded two new variables 
                try { // Try to get the users department if there is an error push the error to the array
                    department = user.organizations[0].department;
                } catch (e) {
                    department = e
                }
                try {// Try to get the users title if there is an error push the error to the array
                    title = user.organizations[0].title;
                } catch (e) {
                    title = e
                }
                listArray.push([user.name.fullName, user.name.givenName, user.name.familyName, user.primaryEmail, department, title, user.id, ]);

            }
        }
        pageToken = page.nextPageToken;
        break; // This means you only get one page
    } while (pageToken);
    try {
        var outputSheet = ss.getSheetByName('allMembers');
        outputSheet.getDataRange();
    } catch (err) {
        var outputSheet = ss.insertSheet('allMembers', 2);
    }
    outputSheet.getDataRange().clear();
    outputSheet.getRange(1, 1, listArray.length, listArray[0].length).setValues(listArray);
    outputSheet.getRange(1, 6, outputSheet.getLastRow(), 4).setHorizontalAlignment("center");
    outputSheet.getRange(1, 1, outputSheet.getLastRow(), 1).setHorizontalAlignment("center");
    var width = [150, 150, 180, 250, 250, 200];
    formatSheet(outputSheet, width);
}

更新

要仅列出某个部门的用户,您只需在 push 周围添加一个 if

 if(department == '--NAME OF DEPARTMENT--'){
      listArray.push([user.name.fullName, user.name.givenName, user.name.familyName, user.primaryEmail, department, title, user.id,]);
   }

【讨论】:

  • 谢谢詹姆斯,我会看看这个。我正在使用 Directory API 文档(它适用于我要查找的其他值)。
  • 对不起,用户 |目录 API 文档。
  • 是的,文档很分散。如果它不起作用,请回发并告诉我们,我将设置字段并在我的域上进行测试。
  • 看起来我们没有使用这些字段。只是以未定义的形式返回。我们使用 GAD 将 AD 从 AD 同步到 G Suite,从中提取部门信息。
  • 即使我也面临同样的问题——我正在使用“user.organizations[0].department o 和 user.organizations[0].title”的任何解决方案
【解决方案2】:

使用 admin SDK 并根据 OrgName、ManagerId、Ref Linkenter link description here 等属性查询您可以search user。 在您的请求中传递查询

     var queryStr="orgDepartment=HR"
     var page = AdminDirectory.Users.list({
                    domain : 'example.com',
                    orderBy : 'givenName',
                    pageToken : pageToken,
                    query:queryStr
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2019-03-26
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 2014-10-13
    相关资源
    最近更新 更多