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

SharePoint 2016本地列表数据未新增:代码日志正常但无数据

问题描述

在SharePoint 2016本地环境中运行以下CSV导入SharePoint列表的代码时,控制台输出“Item added!”日志,但实际数据并未添加到列表中,调试过程中无报错信息,代码在浏览器测试通过。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>CSV to SharePoint</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>

    <label for="csvFileInput">
        <strong>CSV File:</strong>
    </label>
    <input type="file" id="csvFileInput" accept=".csv">
    <button onclick="processFile()">Process File</button>
    
    <div id="output"></div>

    <script type="text/javascript">
        
        var requestDigest;

        // Fetch Request Digest
        $.ajax({
            url: _spPageContextInfo.webAbsoluteUrl + "/_api/contextinfo",
            method: "POST",
            headers: { "Accept": "application/json; odata=verbose" },
            success: function(data) {
                requestDigest = data.d.GetContextWebInformation.FormDigestValue;
            },
            error: function(data, errorCode, errorMessage) {
                console.log(errorMessage);
            }
        });

        function processFile() {
            var files = document.getElementById('csvFileInput').files;
            if (window.FileReader) {
                getAsText(files[0]);
            } else {
                alert('FileReader is not supported in this browser.');
            }
        }

        function getAsText(fileToRead) {
            var reader = new FileReader();
            reader.onload = loadHandler;
            reader.onerror = errorHandler;
            reader.readAsText(fileToRead);
        }

        function loadHandler(event) {
            var csv = event.target.result;
            processDataAsObj(csv);
        }

        function processDataAsObj(csv) {
            var allTextLines = csv.split(/\r\n|\n/);
            var lines = [];
            var keys = allTextLines.shift().split(',');

            while (allTextLines.length) {
                var arr = allTextLines.shift().split(',');
                var obj = {};
                for (var i = 0; i < keys.length; i++) {
                    obj[keys[i]] = arr[i];
                }
                lines.push(obj);
            }

            addToSharePointList(lines);
        }

        function errorHandler(evt) {
            if (evt.target.error.name === "NotReadableError") {
                alert("Cannot read file!");
            }
        }

        function addToSharePointList(dataArray) {
            dataArray.forEach(function (item) {
                var itemData = {
                    '__metadata': { 'type': 'SP.Data.YourListNameListItem' },
                    'Column1': item['Column1'],
                    'Column2': item['Column2']
                };

                $.ajax({
                    url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('YourListName')/items",
                    type: "POST",
                    contentType: "application/json;odata=verbose",
                    data: JSON.stringify(itemData),
                    headers: {
                        "Accept": "application/json;odata=verbose",
                        "X-RequestDigest": requestDigest
                    },
                    success: function (data) {
                        console.log("Item added!");
                    },
                    error: function (data) {
                        console.log("Error: " + data);
                    }
                });
            });
        }
    </script>
</body>
</html>
可能的原因及解决方法

1. 列表实体类型名称错误

SharePoint REST API要求__metadata.type的值必须与列表的内部名称严格匹配,格式为SP.Data.【列表内部名称】ListItem。内部名称区分大小写,若列表名称含空格,内部名称会自动去除空格或替换为下划线,直接使用显示名称会导致请求无效。

解决步骤:

  • 访问以下URL获取列表的正确实体类型名称:
    {站点URL}/_api/web/lists/getbytitle('{列表显示名称}')?$select=ListItemEntityTypeFullName
    
  • 将代码中'SP.Data.YourListNameListItem'替换为返回的ListItemEntityTypeFullName值。

2. 请求摘要(Request Digest)未就绪

原代码中获取requestDigest的AJAX请求是异步执行的,若用户在请求完成前点击“Process File”,requestDigest变量为空,导致创建请求无效,但部分场景下SharePoint会错误触发success回调。

解决代码:

var requestDigest;
var isDigestReady = false;

// Fetch Request Digest
$.ajax({
    url: _spPageContextInfo.webAbsoluteUrl + "/_api/contextinfo",
    method: "POST",
    headers: { "Accept": "application/json; odata=verbose" },
    success: function(data) {
        requestDigest = data.d.GetContextWebInformation.FormDigestValue;
        isDigestReady = true;
    },
    error: function(data, errorCode, errorMessage) {
        console.log(errorMessage);
    }
});

function processFile() {
    if (!isDigestReady) {
        alert("请等待页面初始化完成后再操作");
        return;
    }
    var files = document.getElementById('csvFileInput').files;
    if (window.FileReader) {
        getAsText(files[0]);
    } else {
        alert('FileReader is not supported in this browser.');
    }
}

3. 错误处理逻辑不完整

原代码的error回调仅输出data对象,无法看到具体错误详情,导致请求实际失败却无法排查。

优化后的错误处理:

error: function(xhr, status, error) {
    console.log("添加失败详情: ", JSON.parse(xhr.responseText));
}

4. CSV解析逻辑存在缺陷

原代码使用split(',')分割CSV内容,若单元格包含逗号(如"张三,北京"),会导致解析出的字段错位,生成的item数据不符合列表字段要求,SharePoint会静默忽略无效数据但返回成功。

健壮的CSV解析逻辑:

function processDataAsObj(csv) {
    var allTextLines = csv.split(/\r\n|\n/);
    var lines = [];
    // 正则匹配CSV字段,支持带双引号的内容
    var fieldRegex = /(".*?"|[^",]+)(?=\s*,|\s*$)/g;
    // 提取表头并去除首尾引号
    var keys = allTextLines.shift().match(fieldRegex).map(key => key.replace(/^"|"$/g, ''));

    while (allTextLines.length) {
        var line = allTextLines.shift().trim();
        if (!line) continue; // 跳过空行
        // 提取每行字段并去除首尾引号
        var arr = line.match(fieldRegex).map(val => val.replace(/^"|"$/g, ''));
        var obj = {};
        for (var i = 0; i < keys.length; i++) {
            obj[keys[i]] = arr[i];
        }
        lines.push(obj);
    }
    addToSharePointList(lines);
}

5. 并发请求被SharePoint限制

原代码通过forEach同时发起多个AJAX请求,SharePoint对并发REST请求有限制,部分请求会被静默拦截,导致数据未写入但success回调仍触发。

串行请求优化:

function addToSharePointList(dataArray) {
    function addNextItem(index) {
        if (index >= dataArray.length) {
            console.log("所有CSV项处理完成");
            return;
        }
        var item = dataArray[index];
        var itemData = {
            '__metadata': { 'type': 'SP.Data.替换为正确的实体类型' },
            'Column1': item['Column1'],
            'Column2': item['Column2']
        };

        $.ajax({
            url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('YourListName')/items",
            type: "POST",
            contentType: "application/json;odata=verbose",
            data: JSON.stringify(itemData),
            headers: {
                "Accept": "application/json;odata=verbose",
                "X-RequestDigest": requestDigest
            },
            success: function (data) {
                console.log("Item added! ID: " + data.d.Id);
                addNextItem(index + 1);
            },
            error: function(xhr, status, error) {
                console.log("添加失败,索引: " + index, JSON.parse(xhr.responseText));
                addNextItem(index + 1); // 可选:失败后继续处理下一项
            }
        });
    }
    addNextItem(0);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:55