SharePoint 2016 车辆预订列表防重复JavaScript问题求助
核心逻辑说明
要实现同一车辆同一时间不能重复预订,必须同时匹配已预订车辆的选中值和预订开始时间的精确值,查询列表中是否存在相同条目。之前的问题要么是只校验了车辆维度,要么是查询逻辑错误导致无法检测重复。
可行代码实现
以下代码针对SharePoint 2016新建表单页面,通过REST API查询现有数据,拦截重复提交:
// 等待页面加载完成 _spBodyOnLoadFunctionNames.push('initDuplicateCheck'); function initDuplicateCheck() { // 拦截表单提交按钮事件 document.querySelector("input[id$='SaveItem']").addEventListener("click", function(e) { e.preventDefault(); checkDuplicateBooking(); }); } function checkDuplicateBooking() { // 替换为你的字段内部名称(可通过列表设置→字段属性查看地址栏的Field参数值) var vehicleFieldInternalName = "Vehicle_x0020_Booked"; var startTimeFieldInternalName = "Booking_x0020_Start_x0020_Time"; // 获取选中的车辆值(下拉框实际存储值,非显示文本) var selectedVehicle = document.querySelector("select[id$='_" + vehicleFieldInternalName + "_$DropDownChoice']").value; // 获取并转换开始时间为SharePoint存储的ISO格式 var dateInput = document.querySelector("input[id$='_" + startTimeFieldInternalName + "_$DateTimeFieldDate']").value; var timeInput = document.querySelector("input[id$='_" + startTimeFieldInternalName + "_$DateTimeFieldTime']").value; var selectedStartTime = new Date(dateInput + " " + timeInput).toISOString(); // 构造REST API查询URL var listName = "车辆预订列表"; var queryUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('" + listName + "')/items?$filter=" + vehicleFieldInternalName + " eq '" + selectedVehicle + "' and " + startTimeFieldInternalName + " eq datetime'" + selectedStartTime + "'"; // 发送查询请求 fetch(queryUrl, { headers: { "Accept": "application/json;odata=verbose" } }) .then(response => response.json()) .then(data => { if (data.d.results.length > 0) { alert("该车辆在该时间已被预订,请重新选择!"); } else { // 无重复则提交表单 document.querySelector("#aspnetForm").submit(); } }) .catch(error => { console.error("校验重复时出错:", error); alert("校验重复失败,请重试或联系管理员。"); }); }
关键注意事项
- 字段内部名称:必须使用字段的内部名称,而非显示标题或字段ID。可通过列表设置→点击对应字段→查看浏览器地址栏的
Field=xxx参数值获取。 - 时间格式匹配:SharePoint存储时间为ISO格式,需将表单中的日期和时间组合后转换为对应格式,确保查询条件精准匹配。
- 元素选择器:SharePoint表单元素ID会包含字段内部名称,用
id$='xxx'匹配结尾为目标字段ID的元素,避免前缀变化导致选择失败。 - 权限验证:确保当前用户拥有列表读取权限,否则REST API会返回权限错误。
常见问题排查
- 若仍无法检测重复:打开浏览器控制台(F12),查看REST API请求的返回结果,确认查询参数是否正确、是否返回了预期条目。
- 若出现车辆重复就报错:检查
$filter条件是否同时包含了车辆和时间两个维度,之前的代码可能只写了车辆过滤逻辑。
内容的提问来源于stack exchange,提问作者Nick.Q
相关产品推荐
相关产品推荐

