如何从TXT文件或Outlook(M365)日历获取营业时间配置替代脚本设置?
两种营业时间配置方案的可行性分析
一、从TXT文件读取配置:完全可实现
这是成本最低、最适合非技术员工操作的方案,具体思路如下:
- 把营业时间配置改成结构化格式(推荐JSON,比纯文本好解析,非技术员工只要改内容别碰格式符号就行),存成单独的
business-hours.txt文件,比如内容可以是:{"onlineWeekdays": ["周一至周五 9:00-18:00", "周六 10:00-16:00"]} - 原脚本里去掉硬编码的
onlineweekdays变量,改用fetchAPI读取这个TXT文件,解析后赋值给变量:// 读取外部配置文件 fetch('./business-hours.txt') .then(res => res.text()) .then(txtContent => { const config = JSON.parse(txtContent); window.onlineweekdays = config.onlineWeekdays; // 调用原脚本的初始化逻辑 initBusinessHoursChecker(); }) .catch(err => { console.error('配置读取失败,用默认值兜底:', err); window.onlineweekdays = ["周一至周五 9:00-18:00"]; initBusinessHoursChecker(); }); - 非技术员工修改时,只要打开TXT文件,修改引号里的营业时间内容就行,提醒他们别删引号、逗号这些符号即可;如果担心格式出错,也可以做成每行一个营业时间的纯文本格式,解析时按行拆分处理。
二、从Outlook(M365)日历获取数据:可实现但步骤更复杂
这个方案需要用到微软Graph API,适合需要和企业日历同步的场景,具体流程:
- 在Azure AD注册应用:获取客户端ID、租户ID、客户端密钥,配置应用权限(需要
Calendars.Read权限,允许读取指定日历的事件)。 - 调用Graph API拉取数据:
- 建议用后端调用(避免前端暴露敏感凭证),比如Node.js示例:
const { Client } = require('@microsoft/microsoft-graph-client'); const { ClientSecretCredential } = require('@azure/identity'); // 替换成你的Azure应用凭证 const tenantId = '你的租户ID'; const clientId = '你的客户端ID'; const clientSecret = '你的客户端密钥'; const userId = '日历所属用户ID'; const calendarId = '目标日历ID'; const credential = new ClientSecretCredential(tenantId, clientId, clientSecret); const client = Client.initWithMiddleware({ authProvider: { getAccessToken: async () => { const token = await credential.getToken('https://graph.microsoft.com/.default'); return token.token; } } }); // 获取标记为"营业时间"的日历事件 async function fetchBusinessHoursFromCalendar() { try { const events = await client.api(`/users/${userId}/calendars/${calendarId}/events`) .filter("subject eq '营业时间'") .select('start,end') .get(); // 解析事件时间成脚本需要的格式 return events.value.map(event => { const start = new Date(event.start.dateTime); const end = new Date(event.end.dateTime); return `${start.toLocaleDateString('zh-CN', { weekday: 'long' })} ${start.getHours()}:${start.getMinutes()}-${end.getHours()}:${end.getMinutes()}`; }); } catch (err) { console.error('日历数据拉取失败:', err); return []; } } - 把后端获取到的营业时间数据返回给前端脚本,替换原有的
onlineweekdays变量。
- 建议用后端调用(避免前端暴露敏感凭证),比如Node.js示例:
- 日历事件规范:需要让负责维护的员工在Outlook日历里创建主题为“营业时间”的重复事件,确保事件的起止时间准确,这样API才能正确筛选和解析。
内容的提问来源于stack exchange,提问作者userZolika
相关产品推荐
相关产品推荐

