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
相关产品推荐
相关产品推荐

