在 Mac 上将当天的日历事项导出为 TXT 文件

我经常使用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

使用步骤

  1. 打开“脚本编辑器”: 在你的Mac上,打开“脚本编辑器”应用程序。这是macOS自带的一个应用,可以用来编写和运行AppleScript脚本。
  2. 粘贴脚本: 将上述脚本复制并粘贴到“脚本编辑器”中。
  3. 修改日历名称: 如果你使用的日历名称不是“日常”,请修改脚本中 set theEvents to (get events of calendar "日常" whose start date ≥ startOfDay and start date < endOfDay) 中的 "日常" 为你具体的日历名称。
  4. 运行脚本: 点击“运行”按钮,脚本将开始执行。

image-20240719上午90423490

修改

我做了一些细微调整:

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

在 macOS 一次性关闭所有 chrome 实例 和 Finder 窗口 macOS 上的 pf 与 Linux 上的 iptables:差异与配置