JSOM 的未知错误 API - Sharepoint 2013(将多个唯一的网站栏添加到多个唯一的内容类型)
Unknown Errors with JSOM API - Sharepoint 2013 (Adding multiple, unique site columns to multiple, unique content types)
关于如何执行此操作,我已经进行了几次迭代,但我不确定到底发生了什么。我目前正在开发一种管理工具,可以轻松复制我们的 SharePoint 网站。我一直面临着将站点栏添加到内容类型的任务,通过我的研究,我知道如何做到这一点的唯一方法是通过 JSOM API。我可以添加一些站点列(最多 7 - 8 个)。但是,无论我做什么,根据内容类型尝试全部站点栏(17 或 22)时,我都会遇到 2 个错误中的 1 个。
无法获取列和内容类型。 Error:Invalid 字段名称。 {b0af08d3-136c-43c6-8c0c-df48df70c2c3} - 这基于 SPPostCTFIeldLinksData 的初始函数调用。这不是字段 ID,为什么要填充它?
未知错误。 - 这对我来说是个奇怪的问题。我不确定这是从哪里来的,但似乎查询正在执行,它只是返回一个没有可辨别的消息的错误。
最终,我希望能够为这段代码提供一个网站栏列表,以添加到给定的内容类型(特别是在对象数组中),并添加它们。任何关于我应该如何解决这个问题的建议都将不胜感激。
代码如下:
var ctx = new SP.ClientContext.get_current();
var web = ctx.get_web();
var columns = new Array();
function SPPostCTFieldLinksData(configData) {
document.getElementById('text').value += 'Posting Site Columns to Content Types...\n';
$.get({
url: siteURL,
method: 'GET',
headers: {
"Accept": "application/json;odata=verbose"
},
async: false
}, function (data) {
for (var i = 0; i < data.d.results.length; i++) {
IDs.push({ id: data.d.results[i].Id.StringValue, name: data.d.results[i].Name });
}
});
for (var iFieldsCounter = 0; iFieldsCounter < configData[IDs[0].name]["FieldLinksTitle"].length; iFieldsCounter++) {
columns[iFieldsCounter] = web.get_fields().getByInternalNameOrTitle(configData[IDs[0].name]["FieldLinksTitle"][iFieldsCounter]);
ctx.load(columns[iFieldsCounter]);
}
cttypes = web.get_contentTypes();
ctx.load(cttypes);
ctx.executeQueryAsync(
function () {
addColumns(IDs[0].name, configData[IDs[0].name]["FieldLinksTitle"], columns);
},
function onItemsRefetchedFail(sender, args) {
console.log('Failed to fetch columns and Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());
});
}
function addColumns(ctypeName, fieldsInternalName, createdFields) {
var createdContentType;
var contentTypeEnumerator = cttypes.getEnumerator();
while (contentTypeEnumerator.moveNext()) {
var contentType = contentTypeEnumerator.get_current();
if (contentType.get_name() === ctypeName) {
createdContentType = contentType;
var fieldRef = new Array();
for (var iAddFieldsCounter = 0; iAddFieldsCounter < 11; iAddFieldsCounter++) {
fieldRef[iAddFieldsCounter] = new SP.FieldLinkCreationInformation();
fieldRef[iAddFieldsCounter].set_field(createdFields[iAddFieldsCounter]);
createdContentType.get_fieldLinks().add(fieldRef[iAddFieldsCounter]);
createdContentType.update(true);
}
ctx.load(createdContentType);
ctx.executeQueryAsync(onAddFieldToContentTypeSuccess, onAddFieldToContentTypeFail);
}
}
}
function onAddFieldToContentTypeSuccess() {
alert('Site Columns added to Content Type.');
}
function onAddFieldToContentTypeFail(sender, args) {
alert('Failed to add Site Columns to Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());
}
使用 JSOM API 中提供的枚举器找到答案。在收集网站上列出的所有内容类型和字段后,必须为内容类型枚举器内的字段添加第二个枚举器。
成功回调:
function onQuerysuccess() {
var oEnumerator = oSiteContentTypes.getEnumerator();
var oContentType;
var oSiteColumn;
var cttypeskeys =Object.keys(config["SiteContentTypes"]);
while (oEnumerator.moveNext()) {
oContentType = oEnumerator.get_current();
var oColEnumerator = oSiteColumns.getEnumerator();
while (oColEnumerator.moveNext()) {
oSiteColumn = oColEnumerator.get_current();
if (cttypeskeys.indexOf(oContentType.get_name()) > -1 && config["SiteContentTypes"][oContentType.get_name()]["FieldLinksTitle"].indexOf(oSiteColumn.get_title()) > -1) {
var newSiteCol = new SP.FieldLinkCreationInformation();
newSiteCol.set_field(oSiteColumn);
oContentType.get_fieldLinks().add(newSiteCol);
oContentType.update(true);
clientContext.load(oContentType);
}
}
if (Content Type Name Check) {
clientContext.executeQueryAsync(onsuccess, onfailed);
}
}
}
function onQueryfailed(sender, args) {
document.getElementById('text').value += ('Failed to fetch content type and field data. (' + args.get_message() + ')\n' + args.get_stackTrace());
}
function onsuccess() {
document.getElementById('text').value += 'Content Type Updated.\n';
}
function onfailed(sender, args) {
document.getElementById('text').value += ('Content Type Update failed. (' + args.get_message() + ')\n' + args.get_stackTrace());
}
关于如何执行此操作,我已经进行了几次迭代,但我不确定到底发生了什么。我目前正在开发一种管理工具,可以轻松复制我们的 SharePoint 网站。我一直面临着将站点栏添加到内容类型的任务,通过我的研究,我知道如何做到这一点的唯一方法是通过 JSOM API。我可以添加一些站点列(最多 7 - 8 个)。但是,无论我做什么,根据内容类型尝试全部站点栏(17 或 22)时,我都会遇到 2 个错误中的 1 个。
无法获取列和内容类型。 Error:Invalid 字段名称。 {b0af08d3-136c-43c6-8c0c-df48df70c2c3} - 这基于 SPPostCTFIeldLinksData 的初始函数调用。这不是字段 ID,为什么要填充它?
未知错误。 - 这对我来说是个奇怪的问题。我不确定这是从哪里来的,但似乎查询正在执行,它只是返回一个没有可辨别的消息的错误。
最终,我希望能够为这段代码提供一个网站栏列表,以添加到给定的内容类型(特别是在对象数组中),并添加它们。任何关于我应该如何解决这个问题的建议都将不胜感激。
代码如下:
var ctx = new SP.ClientContext.get_current();
var web = ctx.get_web();
var columns = new Array();
function SPPostCTFieldLinksData(configData) {
document.getElementById('text').value += 'Posting Site Columns to Content Types...\n';
$.get({
url: siteURL,
method: 'GET',
headers: {
"Accept": "application/json;odata=verbose"
},
async: false
}, function (data) {
for (var i = 0; i < data.d.results.length; i++) {
IDs.push({ id: data.d.results[i].Id.StringValue, name: data.d.results[i].Name });
}
});
for (var iFieldsCounter = 0; iFieldsCounter < configData[IDs[0].name]["FieldLinksTitle"].length; iFieldsCounter++) {
columns[iFieldsCounter] = web.get_fields().getByInternalNameOrTitle(configData[IDs[0].name]["FieldLinksTitle"][iFieldsCounter]);
ctx.load(columns[iFieldsCounter]);
}
cttypes = web.get_contentTypes();
ctx.load(cttypes);
ctx.executeQueryAsync(
function () {
addColumns(IDs[0].name, configData[IDs[0].name]["FieldLinksTitle"], columns);
},
function onItemsRefetchedFail(sender, args) {
console.log('Failed to fetch columns and Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());
});
}
function addColumns(ctypeName, fieldsInternalName, createdFields) {
var createdContentType;
var contentTypeEnumerator = cttypes.getEnumerator();
while (contentTypeEnumerator.moveNext()) {
var contentType = contentTypeEnumerator.get_current();
if (contentType.get_name() === ctypeName) {
createdContentType = contentType;
var fieldRef = new Array();
for (var iAddFieldsCounter = 0; iAddFieldsCounter < 11; iAddFieldsCounter++) {
fieldRef[iAddFieldsCounter] = new SP.FieldLinkCreationInformation();
fieldRef[iAddFieldsCounter].set_field(createdFields[iAddFieldsCounter]);
createdContentType.get_fieldLinks().add(fieldRef[iAddFieldsCounter]);
createdContentType.update(true);
}
ctx.load(createdContentType);
ctx.executeQueryAsync(onAddFieldToContentTypeSuccess, onAddFieldToContentTypeFail);
}
}
}
function onAddFieldToContentTypeSuccess() {
alert('Site Columns added to Content Type.');
}
function onAddFieldToContentTypeFail(sender, args) {
alert('Failed to add Site Columns to Content Type. Error:' + args.get_message() + '\n' + args.get_stackTrace());
}
使用 JSOM API 中提供的枚举器找到答案。在收集网站上列出的所有内容类型和字段后,必须为内容类型枚举器内的字段添加第二个枚举器。
成功回调:
function onQuerysuccess() {
var oEnumerator = oSiteContentTypes.getEnumerator();
var oContentType;
var oSiteColumn;
var cttypeskeys =Object.keys(config["SiteContentTypes"]);
while (oEnumerator.moveNext()) {
oContentType = oEnumerator.get_current();
var oColEnumerator = oSiteColumns.getEnumerator();
while (oColEnumerator.moveNext()) {
oSiteColumn = oColEnumerator.get_current();
if (cttypeskeys.indexOf(oContentType.get_name()) > -1 && config["SiteContentTypes"][oContentType.get_name()]["FieldLinksTitle"].indexOf(oSiteColumn.get_title()) > -1) {
var newSiteCol = new SP.FieldLinkCreationInformation();
newSiteCol.set_field(oSiteColumn);
oContentType.get_fieldLinks().add(newSiteCol);
oContentType.update(true);
clientContext.load(oContentType);
}
}
if (Content Type Name Check) {
clientContext.executeQueryAsync(onsuccess, onfailed);
}
}
}
function onQueryfailed(sender, args) {
document.getElementById('text').value += ('Failed to fetch content type and field data. (' + args.get_message() + ')\n' + args.get_stackTrace());
}
function onsuccess() {
document.getElementById('text').value += 'Content Type Updated.\n';
}
function onfailed(sender, args) {
document.getElementById('text').value += ('Content Type Update failed. (' + args.get_message() + ')\n' + args.get_stackTrace());
}