如何通过JSOM及协作列表URL获取SharePoint Online文档库列表?
嗨,我来帮你搞定这个需求!结合你手里的协作列表,用JSOM批量获取每个站点的文档库其实思路很清晰,我给你拆解成具体步骤和可复用的代码示例:
一、整体实现逻辑
咱们的核心思路是:
- 先读取你的协作列表,提取所有有效的站点URL(还可以结合Stage选项过滤,比如只处理Final阶段的站点)
- 针对每个站点URL,创建独立的JSOM上下文,查询该站点下所有BaseTemplate为101的列表(因为SharePoint里文档库的模板ID就是101)
- 收集每个站点的文档库信息,按需输出或存储
二、第一步:读取协作列表的站点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
相关产品推荐
相关产品推荐

