
本文详解如何在 google apps script 中精准实现「按入院天数动态计算 md 访视合规窗口」的条件格式化逻辑,解决因静态阈值导致的误标问题,确保仅在访视日期落在应有时间窗口外时高亮提示。
本文详解如何在 google apps script 中精准实现「按入院天数动态计算 md 访视合规窗口」的条件格式化逻辑,解决因静态阈值导致的误标问题,确保仅在访视日期落在应有时间窗口外时高亮提示。
在医疗随访类电子表格系统中(如医师入院后 90 天内需完成三阶段访视),静态天数判断极易引发逻辑错误:例如入院第 45 天时,若仅检查“上一次 MD 访视是否发生在 10–20 天前”,就会把发生在第 34 天(即 11 天前)的合规访视错误标记为异常——而实际上,该访视完全落在 入院后第 30–60 天的理想窗口内(10/17 +30 = 11/16;10/17 +60 = 12/16;11/20 属于此区间)。
关键在于:判断依据不应是“距今天多少天”,而应是“距入院日多少天”。只有当 LastMDTreatmentDate 落在 [AdmissionDate + 30, AdmissionDate + 60] 这一绝对时间窗口 之外,且当前已处于第 40–50 天的监控期时,才需黄色警示。
✅ 正确逻辑如下:
- 计算
admissionDate到lastMDTreatmentDate的实际间隔天数(记为mdSinceAdmit); - 当前
AdmissionDays在 40–50 之间; - 若
mdSinceAdmit → 访视过早(尚未进入 30 天窗口)→ <strong>不警告</strong>; - 若
mdSinceAdmit > 60→ 访视过晚(已错过 60 天节点)→ 警告; - 若
30 ≤ mdSinceAdmit ≤ 60→ 访视合规 → 不警告; - ⚠️ 但注意:原需求中强调“若无访视落在 30–60 天范围内,则警告”,因此真正要捕获的是:当前已过第 40 天,却仍未出现任何一次 MD 访视落在 [Admission+30, Admission+60] 内。然而,由于数据结构中仅保留
lastMDTreatmentDate(最后一次),我们默认:若最后一次访视都未落入该窗口,则此前更不可能有合规访视(前提:数据完整、按时间倒序更新)。故可安全使用lastMDTreatmentDate做单点判断。
因此,核心校验应改为:
// ✅ 正确:基于入院日计算访视发生时刻(绝对天数)
const admissionDate = new Date(p.admissionDate);
const lastMDDate = new Date(p.lastMDTreatmentDate);
const msPerDay = 24 * 60 * 60 * 1000;
const mdSinceAdmit = Math.floor((lastMDDate.getTime() - admissionDate.getTime()) / msPerDay);
// 当前入院天数(用于触发检查)
const today = new Date();
const admissionDays = Math.floor((today.getTime() - admissionDate.getTime()) / msPerDay);
// 【关键规则】第 40–50 天期间,检查最后一次 MD 访视是否落在 30–60 天窗口内
if (admissionDays >= 40 && admissionDays 60 天 → 视为缺失合规访视 → 高亮警告
if (mdSinceAdmit 60) {
console.log(`Warning: Admission ${admissionDays}d, MD visit at ${mdSinceAdmit}d (outside 30–60d window)`);
out.colors[p.lastMDTreatmentDateCol] = color_warn; // e.g., '#ffff00'
out.notes[p.lastMDTreatmentDateCol] =
`Missing MD visit in days 30–60 post-admission. Current admission age: ${admissionDays}d. Last MD visit: ${mdSinceAdmit}d after admission.`;
out.skip = false;
}
}
? 注意事项:
-
避免使用
MDTreatmentDays(距今天数)做窗口判断 —— 它会随时间推移不断增大,无法反映相对入院日的真实阶段; -
日期差计算务必用
getTime()差值除以毫秒数,而非简单年月日运算,防止跨月/闰年误差; - 若业务要求支持多次访视历史(而不仅是最后一次),则需扩展逻辑:解析全部访视日期数组,用
some()检查是否存在任一日期满足30 ≤ (visitDate - admissionDate) ≤ 60; - 实际部署前,请在
onOpen()或自定义菜单中添加测试函数,用已知日期组合(如示例中 Pulliam 入院 10/17、访视 11/20 →mdSinceAdmit = 34)验证逻辑输出。
总结:时间敏感型条件格式化的本质,是将业务规则(“第 30–60 天必须有一次访视”)准确映射为以起始事件(入院)为锚点的绝对时间区间判断。摒弃“距今天”的思维惯性,转而构建 visitDate ∈ [admitDate + 30d, admitDate + 60d] 的布尔表达式,即可从根本上杜绝误标,让自动化提醒真正服务于临床合规管理。











