能否通过代码在SharePoint Online创建Enterprise Keyword(优先JavaScript)?
Enterprise Keyword本质是Managed Metadata Service(MMS)中「Keywords」术语集下的Term。要通过代码创建并分配给文件,优先用JavaScript+SharePoint REST API实现,以下是具体方案:
一、JavaScript + REST API 实现(适用于SharePoint Online/2019+)
步骤说明
- 定位到「Keywords」术语集的ID;
- 向该术语集添加新的Term(即Enterprise Keyword);
- 可选:将新创建的关键字分配给指定文件。
代码示例
// 获取当前站点对应的Keywords术语集ID fetch(`${_spPageContextInfo.webAbsoluteUrl}/_api/v2.1/termStore/sets?$filter=name eq 'Keywords'`, { headers: { 'Accept': 'application/json;odata=nometadata' } }) .then(res => res.json()) .then(data => { if (!data.value || data.value.length === 0) { console.error('未找到Keywords术语集'); return; } const keywordSetId = data.value[0].id; // 创建新关键字,替换为你需要的名称 addNewKeyword(keywordSetId, "项目迭代v1"); }) .catch(err => console.error('获取术语集失败:', err)); // 向Keywords术语集添加新关键字 function addNewKeyword(setId, keywordName) { fetch(`${_spPageContextInfo.webAbsoluteUrl}/_api/v2.1/termStore/sets(${setId})/terms`, { method: 'POST', headers: { 'Accept': 'application/json;odata=nometadata', 'Content-Type': 'application/json', 'X-RequestDigest': document.getElementById('__REQUESTDIGEST').value }, body: JSON.stringify({ labels: [ { name: keywordName, languageTag: 'zh-CN', // 按实际语言调整,英文用'en-US' isDefault: true } ] }) }) .then(res => res.json()) .then(newTerm => { console.log('关键字创建成功:', newTerm); // 可选:将关键字分配给指定文件,替换为你的文件路径 assignKeywordToFile(newTerm.id, keywordName, "/sites/TeamSite/Shared Documents/需求文档.docx"); }) .catch(err => console.error('创建关键字失败:', err)); } // 将关键字分配给目标文件 function assignKeywordToFile(termId, keywordName, fileUrl) { fetch(`${_spPageContextInfo.webAbsoluteUrl}/_api/web/getfilebyserverrelativeurl('${fileUrl}')/listitemallfields`, { method: 'POST', headers: { 'Accept': 'application/json;odata=nometadata', 'Content-Type': 'application/json;odata=nometadata', 'X-RequestDigest': document.getElementById('__REQUESTDIGEST').value, 'IF-MATCH': '*', 'X-HTTP-Method': 'MERGE' }, body: JSON.stringify({ // Enterprise Keyword字段的内部名称固定为TaxKeyword TaxKeyword: { __metadata: { type: 'SP.Taxonomy.TaxonomyFieldValue' }, Label: keywordName, TermGuid: termId, WssId: -1 } }) }) .then(res => { res.ok ? console.log('关键字已分配给文件') : console.error('分配失败'); }) .catch(err => console.error('分配关键字出错:', err)); }
注意事项
- 执行代码的用户必须拥有Term Store Contributor权限,否则无法创建新术语;
- REST API v2.1仅支持SharePoint Online及2019以上版本,旧版本需改用CSOM;
- 语言标签需与Term Store的默认语言匹配,避免出现显示异常。
二、备选方案:C# CSOM 实现(适用于全版本SharePoint)
如果无法使用JavaScript/REST API,可采用C# CSOM方案:
using Microsoft.SharePoint.Client; using Microsoft.SharePoint.Client.Taxonomy; using System; using System.Security; public static void CreateAndAssignEnterpriseKeyword() { string siteUrl = "https://yourtenant.sharepoint.com/sites/TeamSite"; string keywordName = "项目迭代v1"; string fileRelativeUrl = "/sites/TeamSite/Shared Documents/需求文档.docx"; string username = "user@tenant.onmicrosoft.com"; string password = "yourpassword"; using (var ctx = new ClientContext(siteUrl)) { // SharePoint Online认证,本地环境可改用NetworkCredential ctx.Credentials = new SharePointOnlineCredentials(username, ConvertToSecureString(password)); // 获取默认Term Store及Keywords术语集 var taxonomySession = TaxonomySession.GetTaxonomySession(ctx); var termStore = taxonomySession.GetDefaultSiteCollectionTermStore(); var keywordSet = termStore.GetTermSet("Keywords"); // 也可直接用术语集ID // 创建新关键字(2052是中文LCID,英文用1033) var newKeyword = keywordSet.CreateTerm(keywordName, 2052, Guid.NewGuid()); ctx.Load(newKeyword); ctx.ExecuteQuery(); Console.WriteLine($"关键字创建完成,ID: {newKeyword.Id}"); // 分配关键字到文件 AssignKeywordToFile(ctx, newKeyword, fileRelativeUrl); } } private static void AssignKeywordToFile(ClientContext ctx, Term keyword, string fileUrl) { var file = ctx.Web.GetFileByServerRelativeUrl(fileUrl); var listItem = file.ListItemAllFields; ctx.Load(listItem); ctx.ExecuteQuery(); var taxFieldValue = new TaxonomyFieldValue { Label = keyword.Name, TermGuid = keyword.Id.ToString(), WssId = -1 }; listItem["TaxKeyword"] = taxFieldValue; listItem.Update(); ctx.ExecuteQuery(); Console.WriteLine("关键字已分配给目标文件"); } private static SecureString ConvertToSecureString(string password) { var securePwd = new SecureString(); foreach (char c in password) securePwd.AppendChar(c); return securePwd; }
注意事项
- 需安装NuGet包
Microsoft.SharePointOnline.CSOM或对应版本的CSOM库; - 用户需同时拥有Term Store编辑权限和文件所在列表的编辑权限。
内容的提问来源于stack exchange,提问作者martirodm
相关产品推荐
相关产品推荐

