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

SharePoint 2016 车辆预订列表防重复JavaScript问题求助

SharePoint 2016 列表重复预订校验解决方案

核心逻辑说明

要实现同一车辆同一时间不能重复预订,必须同时匹配已预订车辆的选中值和预订开始时间的精确值,查询列表中是否存在相同条目。之前的问题要么是只校验了车辆维度,要么是查询逻辑错误导致无法检测重复。

可行代码实现

以下代码针对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会返回权限错误。

常见问题排查

  1. 若仍无法检测重复:打开浏览器控制台(F12),查看REST API请求的返回结果,确认查询参数是否正确、是否返回了预期条目。
  2. 若出现车辆重复就报错:检查$filter条件是否同时包含了车辆和时间两个维度,之前的代码可能只写了车辆过滤逻辑。

内容的提问来源于stack exchange,提问作者Nick.Q

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:03:18