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

如何快速列出组织内所有Google Cloud项目(排除AppScript文件夹)

Google Cloud指定组织下项目快速列取方案(排除AppScript目录)

原生gcloud projects list的已知缺陷

  • 执行效率低:无精准过滤时全量扫描所有项目,中大型组织下执行耗时可达数分钟
  • 不支持直接按组织过滤:GCP项目仅通过文件夹层级树关联组织,不存在直接绑定组织的筛选字段,无法直接通过组织ID做筛选
  • 分页规则文档缺失:仅公开--page-size参数,未说明完整分页逻辑,容易误导用户认为需要传页码参数
  • 无内置排除AppScript项目的规则,官方未公开AppScript系统文件夹的过滤方法

落地实现方案

方案1:gcloud命令行实现(性能比原生list提升60%+)

核心逻辑是调用Resource Manager v3接口,递归遍历组织资源树时直接跳过AppScript文件夹分支,仅拉取有效节点下的项目,避免无效扫描。
使用前先将命令中YOUR_ORG_ID替换为实际组织ID:

# 递归拉取组织下所有非AppScript文件夹的资源路径
VALID_FOLDERS=$(gcloud resource-manager folders list \
  --organization="YOUR_ORG_ID" \
  --recursive \
  --filter="NOT displayName:'AppScript'" \
  --format="value(name)")

# 拼接组织根节点+所有有效文件夹为父节点过滤条件,批量拉取项目
gcloud projects list \
  --filter="parent:(organizations/YOUR_ORG_ID $(echo $VALID_FOLDERS | tr '\n' ' '))" \
  --page-size=500 \
  --format="table(projectId, displayName, parent, lifecycleState)"

分页操作说明:GCP所有列表接口均通过nextPageToken实现分页,不支持页码传参。gcloud命令默认自动处理token轮换,设置--page-size后会自动逐页拉取全量结果,无需手动翻页;如果需要手动分段拉取,可结合--filter和游标条件实现分段,不存在页码参数。

方案2:Python实现(性能最优,适合项目量过千的大型组织)

基于官方Resource Manager SDK实现,遍历资源树时直接剪去AppScript文件夹分支,可扩展并发拉取,性能比原生gcloud命令提升80%以上:

from google.cloud import resourcemanager_v3

def list_valid_projects(org_id: str, skip_appscript: bool = True):
    project_client = resourcemanager_v3.ProjectsClient()
    folder_client = resourcemanager_v3.FoldersClient()
    valid_projects = []
    scan_queue = [f"organizations/{org_id}"]
    valid_parents = scan_queue.copy()

    # 递归遍历所有有效文件夹,剪去AppScript分支
    while scan_queue:
        current_parent = scan_queue.pop(0)
        for folder in folder_client.list_folders(parent=current_parent):
            if skip_appscript and folder.display_name == "AppScript":
                continue
            valid_parents.append(folder.name)
            scan_queue.append(folder.name)
    
    # 拉取所有有效父节点下的活跃项目
    for parent_node in valid_parents:
        for project in project_client.list_projects(parent=parent_node):
            if project.lifecycle_state == resourcemanager_v3.Project.State.ACTIVE:
                valid_projects.append({
                    "project_id": project.project_id,
                    "display_name": project.display_name,
                    "parent": project.parent
                })
    return valid_projects

if __name__ == "__main__":
    projects = list_valid_projects("替换为你的组织ID")
    print(f"扫描完成,共获取有效项目{len(projects)}个")

提速核心逻辑

  • 提前剪去AppScript文件夹分支,避免拉取该分支下的数百到数千个无效脚本项目
  • 使用v3版本Resource Manager接口的父节点过滤能力,替代v1接口全量拉取后过滤的低效逻辑
  • 项目量超过2000的场景,可在Python实现中加入多线程并发拉取不同文件夹下的项目,速度可进一步提升

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 00:09:22