关于
一张表,七列,无需账号。约束本身就是重点。
这个页面做什么
它生成一张 HTML 表格:你选择的开始时间和结束时间之间的每个时间段占一行,一周的每一天各占一列。单元格可编辑,这就是整个工具。没有日历后端,没有账号,也没有同步。
页面上的其他内容——打印样式表和 CSV 写入功能——都是为了让这张表能离开浏览器。
生成规则
| 决策 | 规则 | 结果 |
|---|---|---|
| 行 | 从开始时间起,到结束时间为止,但不包含结束时间 | 07:00–22:00、每行 60 分钟,得到 15 行,最后一行是 21:00 |
| 结束时间为空 | 结束时间必须晚于开始时间 | 时间范围无效时会清空网格并给出提示,而不是自行猜测 |
| 行长度 | 15、30 或 60 分钟 | 行越短,单元格越多;打印内容更长,浏览器也更慢 |
| 行数上限 | 96 行 | 足够覆盖 24 小时内每 15 分钟一格的网格;超出后网格停止并给出提示 |
| 天数 | 周一至周日,始终七列 | 没有仅周末或仅工作日的视图;如需更窄,请打印更短的时间范围 |
| 重建 | 文字按日期和时间匹配 | 更改时间范围后文字仍保留;位于已不存在的时间上的文字会被丢弃 |
键盘与输入
单元格是普通的 contenteditable 元素,因此使用浏览器自带的编辑行为:Tab 向前移动,Shift+Tab 向后移动,Enter 在同一天内向下移动,Shift+Enter 在单元格内换行。粘贴会插入文字,但保留多少格式取决于浏览器,所以干净的单元格最好通过手动输入来填写。
每个单元格都带有无障碍标签,例如“Tue 09:00”,因此屏幕阅读器会播报位置,而不是一个空框。表格的时间列和日期列都有表头单元格。
打印
打印按钮会调用浏览器自带的打印对话框;没有服务器端 PDF。打印样式表会隐藏页眉、页脚、导航、控件、标题和 FAQ,设置为横向页面,并防止每一行跨页拆分。剩下的只有标题行和表格。
页边距、缩放和纸张大小仍由浏览器决定:请选择横向;如果列看起来太挤,就不要用 15 分钟行,改用 30 分钟。Safari 和 Firefox 偶尔会忽略 @page 提示而以纵向打印;在对话框中选择横向即可解决。
CSV 导出
导出的是网格,不是日历文件:第一行是 Time,Mon,Tue,…,Sun,之后每一行是一个时间段。包含逗号、双引号或换行的单元格会用引号包裹,内部引号加倍,遵循常见的 CSV 约定。行尾为 CRLF,因此 Excel 打开文件时列不会塌陷。
文件在内存中组装,并通过临时 blob URL 下载;字节不会经过服务器。文件名固定为 weekly-schedule.csv,因此第二次导出不会覆盖第一次,除非你的浏览器设置为覆盖。
它刻意不做的事
- 保存。没有本地存储,没有 cookie,没有账号。刷新会丢失这一周;请先打印或导出。
- 重复。每个网格只对应一周。把打印的表格或 CSV 作为下一周的模板复用。
- 提醒。没有通知,没有邮件,没有日历集成。墙上的网格就是提醒。
- 解决冲突。如果一个单元格里有两件事,它们就都在那里。工具不会决定哪一个优先。
- 了解你的时区。时间只是普通的墙上时钟标签,不附带时区。
无法执行的计划比没有计划更糟。如果网格排得太满,打印前先删掉一些内容。空行正是让这一周经得起现实考验的部分。
页面是如何构建的
四个静态页面、一个样式表和一个脚本,由本域名提供。没有框架,没有第三方脚本,没有分析,没有 cookie。网格构建器是使用 DOM API 的普通 JavaScript;时间段计算和 CSV 写入是纯函数,并在浏览器之外有测试覆盖。
更正
时间段和 CSV 规则位于共享脚本中,而不是页面文字里。修复会改在那里并对照测试检查,因此工具和这段说明不会彼此脱节。