在 Mac 上将当天的日历事项导出为 TXT 文件
2024-07-17 software mac applescript 13 mins 1 图 4833 字
我经常使用Mac上的日历应用,公司每天也要写日报,于是将日历中当天的事项导出为TXT文件,可以省下很多心力做其他事情。我尝试了将近一个月,感觉不错。
本文将详细介绍如何使用 AppleScript 实现这一目标。通过简单的脚本,可以获取当天所有的日历事件,将它们导出到一个带有当前日期的TXT文件中,显示导出的记录数量。如果结合 crontab 还能完成定时自动导出的工作,甚至,结合selenium,还可以自动化填写日报。
前提条件
在开始之前,请确保你已经授予 AppleScript 访问日历的权限。如果这是你第一次运行此脚本,系统可能会提示你授权访问。
脚本说明
以下是完整的 AppleScript 脚本,确保从当天凌晨0点到当天晚上12点之间的“日常”下的所有日历事件,并将它们导出到桌面的TXT文件中。文件名将包含当前日期,并在完成导出后显示一个弹窗,告知导出的记录数量。
tell application "Calendar"
-- 获取当前日期
set currentDate to current date
-- 设置今天的开始时间为凌晨0点
set startOfDay to currentDate
set time of startOfDay to 0
-- 设置今天的结束时间为晚上12点
set endOfDay to startOfDay + 1 * days
-- 获取"日常"日历中的今天的事件
set theEvents to (get events of calendar "日常" whose start date ≥ startOfDay and start date < endOfDay)
set eventDetails to ""
repeat with theEvent in theEvents
set eventDetails to eventDetails & (summary of theEvent) & " - " & (start date of theEvent) & return
end repeat
-- 获取当前日期的年月日
set {year:y, month:m, day:d} to (current date)
set monthText to text -2 thru -1 of ("0" & (m as integer) as string)
set dayText to text -2 thru -1 of ("0" & (d as integer) as string)
set dateText to (y as string) & "-" & monthText & "-" & dayText
-- 设置文件名
set fileName to "daily-" & dateText & ".txt"
-- 导出事件到文件
do shell script "echo " & quoted form of eventDetails & " > ~/Desktop/" & fileName
-- 显示导出记录数量的弹窗
display dialog "导出了 " & (count of theEvents) & " 条记录。" with title "导出完成"
end tell
使用步骤
- 打开“脚本编辑器”: 在你的Mac上,打开“脚本编辑器”应用程序。这是macOS自带的一个应用,可以用来编写和运行AppleScript脚本。
- 粘贴脚本: 将上述脚本复制并粘贴到“脚本编辑器”中。
- 修改日历名称:
如果你使用的日历名称不是“日常”,请修改脚本中
set theEvents to (get events of calendar "日常" whose start date ≥ startOfDay and start date < endOfDay)
中的"日常"
为你具体的日历名称。 - 运行脚本: 点击“运行”按钮,脚本将开始执行。
修改
我做了一些细微调整:
tell application "Calendar"
-- 获取当前日期
set currentDate to current date
-- 设置某个日期
-- set currentDate to date "2024年7月23日 上午12:00:00"
-- 设置今天的开始时间为凌晨0点
set startOfDay to currentDate
set time of startOfDay to 0
-- 设置今天的结束时间为晚上12点
set endOfDay to startOfDay + (1 * days)
-- 获取"日常"日历中的今天的事件
set theEvents to (get events of calendar "日常" whose start date ≥ startOfDay and start date < endOfDay)
set eventDetails to ""
set eventCount to count of theEvents
set eventNumber to 1
-- 构建总结性内容
-- set summaryContent to "当前日期: " & (startOfDay as string) & " - 总共: " & eventCount & " 个日历事项" & return & return
set summaryContent to "共" & eventCount & "个事项:" & return
repeat with theEvent in theEvents
-- 获取事件的开始时间
set eventStartDate to start date of theEvent
-- 提取时间部分并格式化
set eventTime to time of eventStartDate
-- 减去8小时调整时间,有时候有偏移,就手动改一下,没有就-0
set adjustedTime to eventStartDate - (0 * hours)
-- 格式化调整后的时间为字符串
set timeString to (time string of adjustedTime)
-- 格式化事件编号
if eventNumber < 10 then
set formattedNumber to "0" & eventNumber
else
set formattedNumber to eventNumber as string
end if
-- 构建事件详情字符串(仅内容)
set eventDetails to eventDetails & formattedNumber & ". " & (summary of theEvent) & return
-- 构建事件详情字符串(包含时间)
-- set eventDetails to eventDetails & formattedNumber & ". " & (summary of theEvent) & " - " & timeString & return
set eventNumber to eventNumber + 1
end repeat
-- 获取当前日期的年月日
-- set {year:y, month:m, day:d} to (current date)
-- 获取 startOfDay 的年月日
set {year:y, month:m, day:d} to startOfDay
set monthText to text -2 thru -1 of ("0" & (m as integer) as string)
set dayText to text -2 thru -1 of ("0" & (d as integer) as string)
set dateText to (y as string) & "-" & monthText & "-" & dayText
-- 设置文件名
set fileName to "daily-" & dateText & ".txt"
-- 导出事件到文件
-- do shell script "echo " & quoted form of (summaryContent & eventDetails) & " > ~/Desktop/" & fileName
do shell script "echo " & quoted form of (summaryContent & eventDetails) & " > ~/Desktop/" & fileName
-- 显示导出记录数量的弹窗
-- display dialog "导出了 " & (count of theEvents) & " 条记录。" with title "导出完成"
end tell
因为平时更习惯用shell,所以我还配合写了一个shell脚本,方便 crontab 调用:
#!/bin/bash
# 获取当前年份和周数
YEAR=$(date +%y) # 获取当前年份的最后两位,例如 24
WEEK=$(date +%V) # 获取当前周数,例如 16
# 获取当前日期的文件名
TODAY=$(date +%Y-%m-%d) # 格式为 YYYY-MM-DD
FILENAME="daily-${TODAY}.txt"
# 组合目录名
DIRECTORY_NAME="${YEAR}${WEEK}"
# 目标路径
TARGET_PATH="/Users/kelu/Library/Mobile Documents/com~apple~CloudDocs/${DIRECTORY_NAME}"
# 创建目录
mkdir -p "${TARGET_PATH}"
osascript "/Users/kelu/Library/Mobile Documents/com~apple~ScriptEditor2/Documents/导出今天日历.scpt"
# 源文件路径
SOURCE_FILE="/Users/kelu/Desktop/${FILENAME}"
# 移动文件
if [ -f "${SOURCE_FILE}" ]; then
mv "${SOURCE_FILE}" "${TARGET_PATH}/"
echo "文件已移动: ${SOURCE_FILE} -> ${TARGET_PATH}/"
else
echo "文件未找到: ${SOURCE_FILE}"
fi