
本文介绍如何通过 apps script 后端校验 + 前端表单联动,精准检测同一租赁类型下新预订与历史订单的日期重叠,有效防止双订、错订,保障库存一致性。
本文介绍如何通过 apps script 后端校验 + 前端表单联动,精准检测同一租赁类型下新预订与历史订单的日期重叠,有效防止双订、错订,保障库存一致性。
在婚纱礼服租赁类 Web 应用中,确保同一商品(如“Gown”)在指定时间段内不被多次预订,是核心业务逻辑。仅靠前端日期控件无法保证数据安全——用户可绕过限制或篡改请求。因此,必须在 Apps Script 服务端执行严格的重叠判断,并与前端表单提交流程无缝集成。
核心逻辑:日期重叠判定公式
两个时间区间 [A_start, A_end) 与 [B_start, B_end) 存在重叠,当且仅当:
A_start < B_end 且 B_start < A_end
注意:此处采用左闭右开区间(即取货日包含,归还日不包含),避免相邻订单(如 2024-06-01 归还 & 2024-06-01 取货)被误判为冲突,更符合实际业务场景。
用于管理博客文章的 Blogger API 命令行工具,可发布、编辑、删除、列出和监控 Blogger 博客。适用于用户需要:(1) 在 Blogger 上发布博客文章...
优化后的 Apps Script 函数(推荐使用)
function checkBookingOverlap(rtype, rpu, rrt) {
// 统一截断为日期级时间戳(忽略时分秒),消除时区/格式干扰
const rpuv = justTheDate(rpu).value;
const rrtv = justTheDate(rrt).value;
const sh = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Booking Data");
// 假设数据结构:E列=rentalType, F列=pickUpDate, G列=returnDate(从第2行开始)
const rg = sh.getRange(2, 5, sh.getLastRow() - 1, 3);
const vs = rg.getValues();
for (let i = 0; i < vs.length; i++) {
const [stype, spu, srt] = vs[i];
if (!stype || !spu || !srt) continue; // 跳过空行
const spuv = justTheDate(new Date(spu)).value;
const srtv = justTheDate(new Date(srt)).value;
// 关键重叠条件(左闭右开)
if (rtype === stype && rpuv < srtv && spuv < rrtv) {
return true; // 发现重叠,拒绝提交
}
}
return false; // 无重叠,允许预订
}
// 工具函数:将任意 Date 对象标准化为当日零点时间戳
function justTheDate(dt) {
const d = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate());
return { date: d, value: d.valueOf() };
}✅ 关键改进点说明:
- 使用
justTheDate()统一处理日期精度,彻底规避因时间部分(如14:30:00)导致的误判; - 简化重叠条件为
rpuv ,逻辑更清晰、不易出错; - 增加空值校验
if (!stype || !spu || !srt) continue,提升健壮性; - 使用
let替代var,避免变量作用域问题。
前端调用示例(HTML + JavaScript)
在您的 <form></form> 提交前,需通过 google.script.run 异步调用后端校验:
<script>
function handleFormSubmit(form) {
event.preventDefault(); // 阻止默认提交
const rentalType = form.rentalType.value;
const pickUpDate = form.pickUpDate.value;
const returnDate = form.returnDate.value;
// 前端基础校验(提升用户体验)
if (!rentalType || !pickUpDate || !returnDate) {
alert("请完整填写租赁类型与日期!");
return;
}
// 调用 Apps Script 后端校验
google.script.run
.withSuccessHandler(function(isOverlap) {
if (isOverlap) {
alert("⚠️ 抱歉,该时段已被预订,请选择其他日期。");
} else {
form.submit(); // 无重叠,提交表单
}
})
.withFailureHandler(function(error) {
console.error("校验失败:", error);
alert("系统异常,请稍后重试。");
})
.checkBookingOverlap(rentalType, pickUpDate, returnDate);
}
</script>注意事项与最佳实践
-
数据表结构一致性:确保
"Booking Data"表中 E/F/G 列严格对应rentalType/pickUpDate/returnDate,且日期列为标准Date格式(非文本); -
性能考虑:若订单量超千条,建议对
Booking Data表按rentalType和日期范围建立索引(可通过辅助列+FILTER实现),或升级至 Cloud SQL; -
并发安全:当前方案未处理高并发下的竞态条件(如两用户同时提交相同时段)。生产环境应结合锁机制(如
PropertiesService全局锁)或事务性数据库; - 用户体验增强:可在日期选择器中动态禁用已占用日期(需预加载可用时段),实现更友好的实时反馈。
通过以上方案,您将构建出既准确又可靠的防重叠预订机制,显著提升系统可信度与用户满意度。

















