You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Google Apps Script排除AD组及成员并删除对应行

解决Active Directory组列表中排除指定组及成员的问题

需要导出所有Active Directory组及其成员,但要排除6个指定组(badgroup1@domain.org、badgroup2@domain.org等),同时这些组中的跨域成员(如member@other.domain.org)也不需要出现在结果中。

修改后的完整代码

function listAllGroups() {
  const RatatoskSheet = SpreadsheetApp.getActiveSpreadsheet();
  const grouprows = [];
  // 定义需要排除的组列表,将6个目标组全部添加进去
  const excludedGroups = ["badgroup1@domain.org", "badgroup2@domain.org", "badgroup3@domain.org", "badgroup4@domain.org", "badgroup5@domain.org", "badgroup6@domain.org"];
  const targetDomain = "@domain.org"; // 目标成员域名
  let pageToken;

  // 获取并过滤组:直接排除指定组,不加入后续处理队列
  do {
    const page = AdminDirectory.Groups.list({ domain: 'domain.org', maxResults: 100, pageToken: pageToken });
    const groups = page.groups;
    if (groups) {
      for (let i = 0; i < groups.length; i++) {
        const group = groups[i];
        // 仅保留不在排除列表中的组
        if (!excludedGroups.includes(group.email)) {
          grouprows.push(group.email);
        }
      }
    }
    pageToken = page.nextPageToken;
  } while (pageToken);

  const rows = [];
  let pageToken2;

  // 获取过滤后组的成员,同时排除非目标域名的成员
  for (let j = 0; j < grouprows.length; j++) {
    const currentGroup = grouprows[j];
    do {
      const page2 = AdminDirectory.Members.list(currentGroup, { maxResults: 1000, pageToken: pageToken2 });
      const members = page2.members;
      if (members) {
        for (let i = 0; i < members.length; i++) {
          const member = members[i];
          // 仅保留目标域名下的成员
          if (member.email.endsWith(targetDomain)) {
            rows.push([member.email, currentGroup]);
          }
        }
      }
      pageToken2 = page2.nextPageToken;
    } while (pageToken2);
  }

  // 一次性写入表格,避免重复操作提升效率
  const groupData = RatatoskSheet.getSheetByName("Groups");
  groupData.clear();
  const header = ['UserEmail', 'GroupID'];
  groupData.appendRow(header).setFrozenRows(1);
  if (rows.length > 0) {
    groupData.getRange(2, 1, rows.length, header.length).setValues(rows);
  }
}

关键修改说明

  1. 组过滤逻辑:提前定义排除组数组,在将组加入处理队列前直接过滤,从源头上避免无效组进入后续流程,比事后删除更高效准确。
  2. 成员过滤逻辑:通过endsWith(targetDomain)筛选目标域名成员,自动排除跨域成员,无需单独处理指定组的成员。
  3. 写入优化:将表格写入操作移到所有数据处理完成后,避免循环中重复清除和写入,减少不必要的API调用。

你之前方法无效的原因

  1. 错误使用groups[i].remove():API返回的组是普通对象数组,没有remove()方法,且你先把所有组加入了队列再尝试删除,等于无效操作。
  2. 错误匹配字段:用getName()获取组显示名称,却用邮箱字符串匹配,自然无法命中目标组。
  3. deleteRows函数问题:
    • 第一个函数循环删除行时索引计算容易出错,且可能误处理表头行;
    • 第二个函数错误检查单元格公式,而表格中是静态值,根本找不到目标行。
  4. 语法错误代码:
    • 多余的JSON.parse(),AdminDirectory直接返回对象无需解析;
    • 用g.id匹配邮箱列表,字段不匹配导致过滤失效。

内容的提问来源于stack exchange,提问作者LDB_DATA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 00:14:56