【问题标题】:Unknown Errors with JSOM API - Sharepoint 2013 (Adding multiple, unique site columns to multiple, unique content types)JSOM API 的未知错误 - Sharepoint 2013(将多个唯一站点列添加到多个唯一内容类型)
【发布时间】:2020-07-11 06:27:56
【问题描述】:

我已经经历了几次关于如何做到这一点的迭代,但我不确定到底发生了什么。我目前正在开发一种管理工具,可以轻松复制我们的 SharePoint 网站。我一直面临着将站点列添加到内容类型的任务,并且通过我的研究,我知道如何做到这一点的唯一方法是通过 JSOM API。我可以添加一些站点列(最多 7 - 8 个)。但是,无论我做什么,在尝试取决于内容类型的全部网站栏(17 或 22)时,我都会遇到 2 个错误中的 1 个。

  1. 无法获取列和内容类型。错误:无效的字段名称。 {b0af08d3-136c-43c6-8c0c-df48df70c2c3} - 这是基于 SPPostCTFIeldLinksData 的初始函数调用。这不是字段 ID,为什么要填充它?

  2. 未知错误。 - 这对我来说是一个奇怪的问题。我不确定这是从哪里来的,但似乎查询正在执行,它只是返回一个没有可识别消息的错误。

最终,我希望能够为这段代码提供一个网站栏列表,以添加到给定的内容类型(特别是在对象数组中),并添加它们。任何关于我应该如何解决这个问题的建议将不胜感激。

代码如下:

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());  
}

【问题讨论】:

    标签: sharepoint-online sharepoint-jsom sharepoint-rest-api


    【解决方案1】:

    使用 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());
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 2013-01-23
      • 2015-06-20
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多