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

如何通过JSOM及协作列表URL获取SharePoint Online文档库列表?

解决方案:结合协作列表批量获取SharePoint站点文档库(JSOM实现)

嗨,我来帮你搞定这个需求!结合你手里的协作列表,用JSOM批量获取每个站点的文档库其实思路很清晰,我给你拆解成具体步骤和可复用的代码示例:

一、整体实现逻辑

咱们的核心思路是:

  1. 先读取你的协作列表,提取所有有效的站点URL(还可以结合Stage选项过滤,比如只处理Final阶段的站点)
  2. 针对每个站点URL,创建独立的JSOM上下文,查询该站点下所有BaseTemplate为101的列表(因为SharePoint里文档库的模板ID就是101)
  3. 收集每个站点的文档库信息,按需输出或存储

二、第一步:读取协作列表的站点URL

首先,咱们需要先从你的协作列表里把站点URL读出来。假设你的列表名为Site Inventory,下面是JSOM代码示例:

// 初始化当前站点的上下文(你的协作列表所在的站点)
var currentContext = new SP.ClientContext.get_current();
var web = currentContext.get_web();
// 获取协作列表
var siteList = web.get_lists().getByTitle("Site Inventory");

// 构建CAML查询,可选:可以根据Stage字段过滤,比如只取Final阶段的站点
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml('<View><Query><Where><Eq><FieldRef Name="Stage"/><Value Type="Choice">Final</Value></Eq></Where></Query></View>');

var listItems = siteList.getItems(camlQuery);
// 加载需要的字段:Site Title、URL Link to the Site
currentContext.load(listItems, 'Include(Title, URL_x0020_Link_x0020_to_x0020_t)');

currentContext.executeQueryAsync(
    function() {
        var siteUrls = [];
        var listItemEnumerator = listItems.getEnumerator();
        while (listItemEnumerator.moveNext()) {
            var item = listItemEnumerator.get_current();
            // 获取URL字段的值(注意字段内部名称可能需要调整,你可以在列表设置里查看)
            var siteUrl = item.get_item('URL_x0020_Link_x0020_to_x0020_t').get_url();
            var siteTitle = item.get_title();
            siteUrls.push({title: siteTitle, url: siteUrl});
        }
        // 拿到所有站点URL后,调用下一步批量获取文档库的函数
        getAllSiteDocumentLibraries(siteUrls);
    },
    function(sender, args) {
        console.error('读取协作列表失败: ' + args.get_message());
    }
);

注意:字段的内部名称可能和显示名不同,比如URL Link to the Site的内部名称可能是URL_x0020_Link_x0020_to_x0020_t,你可以在列表设置的字段编辑页面查看浏览器地址栏里的Field参数值。


三、第二步:用JSOM获取单个站点的文档库

接下来,咱们写一个通用函数,传入单个站点URL,返回该站点下的所有文档库:

function getDocumentLibrariesForSite(siteUrl) {
    return new Promise(function(resolve, reject) {
        // 创建目标站点的上下文
        var siteContext = new SP.ClientContext(siteUrl);
        var siteWeb = siteContext.get_web();
        // 获取站点下所有列表,筛选BaseTemplate=101(文档库)的列表
        var lists = siteWeb.get_lists();
        siteContext.load(lists, 'Include(Title, Id, RootFolder/ServerRelativeUrl)');

        siteContext.executeQueryAsync(
            function() {
                var docLibraries = [];
                var listEnumerator = lists.getEnumerator();
                while (listEnumerator.moveNext()) {
                    var list = listEnumerator.get_current();
                    // 只保留文档库(BaseTemplate=101),排除隐藏的系统列表(可选)
                    if (list.get_baseTemplate() === 101 && !list.get_hidden()) {
                        docLibraries.push({
                            title: list.get_title(),
                            id: list.get_id().toString(),
                            serverRelativeUrl: list.get_rootFolder().get_serverRelativeUrl()
                        });
                    }
                }
                resolve({siteUrl: siteUrl, libraries: docLibraries});
            },
            function(sender, args) {
                console.error(`获取站点${siteUrl}的文档库失败: ` + args.get_message());
                reject({siteUrl: siteUrl, error: args.get_message()});
            }
        );
    });
}

这里用了Promise来处理异步操作,方便后续批量处理时控制流程。


四、第三步:批量处理所有站点的文档库

现在咱们把前面的步骤结合起来,批量处理从协作列表拿到的所有站点:

function getAllSiteDocumentLibraries(siteUrls) {
    var promises = [];
    // 为每个站点创建Promise任务
    siteUrls.forEach(function(site) {
        promises.push(getDocumentLibrariesForSite(site.url));
    });

    // 等待所有任务完成(成功或失败都能拿到结果)
    Promise.allSettled(promises)
        .then(function(results) {
            // 处理结果:成功的输出文档库,失败的记录错误
            results.forEach(function(result) {
                if (result.status === 'fulfilled') {
                    console.log(`站点${result.value.siteUrl}的文档库:`);
                    console.table(result.value.libraries);
                    // 这里可以把结果存储到另一个列表或者导出为Excel,按需处理
                } else {
                    console.error(`站点${result.reason.siteUrl}处理失败: ${result.reason.error}`);
                }
            });
        });
}

五、关键注意事项

  • 权限问题:当前执行代码的用户需要拥有所有目标站点的读取权限,否则会出现权限不足的错误
  • 异步控制:如果站点数量较多,建议不要一次性发起所有请求,可以分批次处理(比如每次处理5个站点),避免触发SharePoint的请求限制
  • 字段内部名称:一定要确认协作列表中URL Link to the Site字段的内部名称,否则会获取不到值
  • 系统列表排除:代码里加了!list.get_hidden()来排除隐藏的系统列表,如果你需要包含这些,可以去掉这个判断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:19:04