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

如何通过JSOM获取SharePoint站点所有网站中所有列表的项数?

嘿,我完全懂你想把之前获取所有列表项的逻辑改成只返回列表项数量的需求!毕竟拉取所有项不仅慢,还没必要——直接用SharePoint列表自带的统计属性就搞定了,效率高多了。

下面我就基于你现有的JSOM代码,帮你调整实现逻辑,直接获取每个网站下所有列表的条目数,还支持递归遍历所有子网站哦:

核心思路

不用加载所有列表项,而是利用列表的ItemCount属性——这个属性直接存储了列表的当前条目数,不需要遍历或查询所有项,性能提升非常明显。如果需要绝对实时的数量(比如刚新增了项还没更新缓存),也可以用list.get_items().get_count(),但前者更推荐。

修改后的完整代码

function retrieveAllListItemCounts() {
    var clientContext = new SP.ClientContext.get_current();
    var rootWeb = clientContext.get_web();
    
    // 先处理根网站,再递归遍历所有子网站
    getWebListItemCounts(rootWeb, function() {
        console.log("✅ 所有网站的列表项计数已获取完成!");
    });
}

function getWebListItemCounts(web, callback) {
    var clientContext = web.get_context();
    var lists = web.get_lists();
    
    // 只加载我们需要的两个属性:列表标题和项数,减少数据传输
    clientContext.load(lists, 'Include(Title, ItemCount)');
    
    clientContext.executeQueryAsync(
        function() {
            var listEnumerator = lists.getEnumerator();
            console.log(`\n--- 📄 网站: ${web.get_title()} ---`);
            
            while (listEnumerator.moveNext()) {
                var list = listEnumerator.get_current();
                // 可选:过滤特定类型的列表,比如只统计公告列表
                // if (list.get_title().includes("公告")) {
                    console.log(`📋 列表: ${list.get_title()} | 项数: ${list.get_itemCount()}`);
                // }
            }
            
            // 递归处理当前网站的所有子网站
            var subWebs = web.get_webs();
            clientContext.load(subWebs);
            clientContext.executeQueryAsync(
                function() {
                    var subWebEnumerator = subWebs.getEnumerator();
                    var completedSubWebs = 0;
                    var totalSubWebs = subWebs.get_count();
                    
                    // 没有子网站的话直接回调
                    if (totalSubWebs === 0) {
                        callback();
                        return;
                    }
                    
                    // 逐个处理子网站,全部完成后再触发回调
                    while (subWebEnumerator.moveNext()) {
                        var subWeb = subWebEnumerator.get_current();
                        getWebListItemCounts(subWeb, function() {
                            completedSubWebs++;
                            if (completedSubWebs === totalSubWebs) {
                                callback();
                            }
                        });
                    }
                },
                function(sender, args) {
                    console.error(`❌ 获取子网站失败: ${args.get_message()}`);
                    callback();
                }
            );
        },
        function(sender, args) {
            console.error(`❌ 获取网站列表失败: ${args.get_message()}`);
            callback();
        }
    );
}

// 启动执行
retrieveAllListItemCounts();

关键细节说明

  • 性能优化:用Include(Title, ItemCount)指定只加载需要的属性,避免拉取列表的冗余数据,在大型站点集里差异特别明显。
  • 递归遍历:自动处理当前网站下的所有子网站,确保不会遗漏任何层级的列表。
  • 可选过滤:代码里加了注释示例,如果你只想统计特定列表(比如公告列表、文档库),可以取消注释并调整过滤条件。
  • 异步回调:因为JSOM是异步操作,用回调函数确保所有网站都处理完成后再提示结果,避免数据不全。

注意事项

  1. 确保当前用户有读取所有目标网站和列表的权限,否则会出现权限错误。
  2. 如果是超大型站点集,建议添加少量延迟或者分页逻辑,避免短时间内发起过多请求导致性能问题。
  3. ItemCount是SharePoint缓存的统计值,一般延迟很小;如果需要绝对实时的数量,可以把list.get_itemCount()替换成list.get_items().get_count(),但这个会触发对列表项的查询,性能会稍差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:56:09