虽然苹果在iOS 18推出了整合行事历与提醒事项的功能,让iPhone行事历可以显示、确认提醒事项的内容,但如果你因为种种任何原因没有升级到iOS 18,但是又想要让iPhone行事历可以和提醒事项做整合的话,有什么好用的技巧吗?
今天这篇就要教大家如把 iPhone 提醒事项同步到行事历里面,而且开启日历就自动完成,不需要手动设置。
iPhone 行事历自动同步提醒事项教程
这里我们会一步一步带大家完成 iPhone 开启行事历就自动同步提醒事项的步骤。
第一步:建立名称相同的提醒事项列表与行事历
因为等一下我们需要借助第三方App写脚本来同步iPhone行事历与提醒事项,而这个脚本在执行同步的规则就是找到「日历名称」与「提醒列表名称」相同的来进行同步。
你可以使用提醒事项App里面默认的这个「提醒事项」列表,也可以自行建立一个。 为了之后说明的时候好辨识,我新增一个叫做「待办事项」的提醒事项列表。

再来,新增一个叫做「待办事项」的行事历。 如果你有好几个不同的提醒事项列表要同步的话,就在继续新增多个行事历。

日历的名称记得要和刚才设置好的待办事项列表名称相同。
总之记住一个原则,要同步的「提醒事项列表名称」与「日历名称」一定要一样才会进行同步。
第二步:制作 Scriptable 同步脚本
要达到 iPhone 开启行事历就自动同步提醒事项,必须要藉由第三方 App 写脚本来帮我们完成这件事,所以下载《Scriptable》这个 App。
Scriptable 下载:https://apps.apple.com/cn/app/scriptable/id1405459188

新增一个 Scriptable 脚本,并且把以下内容复制过去,Scriptable 上面的名称也可以改成一个比较好辨识的名字,之后就可以完成并退出 Scriptable。

var dur_month = 1
const startDate = new Date()
startDate.setMonth(startDate.getMonth() - dur_month)
console.log(`日曆的開始時間 ${startDate.toLocaleDateString()}`)
const endDate = new Date()
endDate.setMonth(endDate.getMonth() + dur_month)
console.log(`日曆的結束時間 ${endDate.toLocaleDateString()}`)
const reminders = await Reminder.allDueBetween(startDate, endDate)
console.log(`獲取 ${reminders.length} 條提醒事項`)
var calendar = await Calendar.forEvents()
//獲取日曆名和對應的日曆
var m_dict = {}
for(cal of calendar)
{
m_dict[cal.title] = cal
//console.log(`日曆:${cal.title}`)
}
const events = await CalendarEvent.between(startDate, endDate, calendar)
console.log(`獲取 ${events.length} 條日曆`)
var reminders_id_set = new Set(reminders.map(e=>e.identifier))
//刪除日曆里提醒事項刪除的事項
events_created = events.filter(e=>e.notes != null && e.notes.includes("[Reminder]"))
for(let event of events_created){
//console.warn(event.notes)
let reg = /([Reminder])s([A-Z0-9-]*)/
let r = event.notes.match(reg)
//if(r) console.log(r[2])
if(!reminders_id_set.has(r[2]))
{
event.remove()
}
}
for (const reminder of reminders) {
//reminder的標識符
const targetNote = `[Reminder] ${reminder.identifier}`
const [targetEvent] = events.filter(e => e.notes != null && e.notes.includes(targetNote))//過濾重復的reminder
if(!m_dict[reminder.calendar.title])
{
console.warn("找不到日曆"+ reminder.calendar.title)
continue
}
if (targetEvent) {
//console.log(`找到已經創建的事項 ${reminder.title}`)
updateEvent(targetEvent, reminder)
} else {
console.warn(`創建事項 ${reminder.title} 到 ${reminder.calendar.title}`)
const newEvent = new CalendarEvent()
newEvent.notes = targetNote + "n" + reminder.notes//要加入備注
updateEvent(newEvent, reminder)
}
}
Script.complete()
function updateEvent(event, reminder) {
event.title = `${reminder.title}`
cal_name = reminder.calendar.title
cal = m_dict[cal_name]
event.calendar = cal
//console.warn(event.calendar.title)
//已完成事項
if(reminder.isCompleted)
{
event.title = `${reminder.title}`
event.isAllDay = true
event.startDate = reminder.dueDate
event.endDate=reminder.dueDate
// var ending = new Date(reminder.completionDate)
// ending.setHours(ending.getHours()+1)
// event.endDate = ending
var period = (reminder.dueDate-reminder.completionDate)/1000/3600/24
period = period.toFixed(1)
if(period < 0)
{
period = -period
event.location = " 延期" + period + "天完成"
}
else if (period == 0)
{
event.location = " 準時完成"
}
else
{
event.location = " 提前" + period + "天完成"
}
}
//未完成事項
else{
const nowtime = new Date()
var period = (reminder.dueDate-nowtime)/1000/3600/24
period = period.toFixed(1)
//console.log(reminder.title+(period))
if(period < 0)
{
//待辦順延
event.location = " 延期" + (-period) + "天"
//如果不是在同一天,設置為全天事項
if(reminder.dueDate.getDate() != nowtime.getDate())
{
event.title = `${reminder.title}`
event.startDate = nowtime
event.endDate = nowtime
event.isAllDay = true
}
//在同一天的保持原來的時間
else
{
event.title = `${reminder.title}`
event.isAllDay = false
event.startDate = reminder.dueDate
var ending = new Date(reminder.dueDate)
ending.setHours(ending.getHours()+1)
event.endDate = ending
}
console.log(`【${reminder.title}】待辦順延${-period}天` )
}
else
{
event.title = `${reminder.title}`
event.isAllDay = false
event.location = "還剩" + period + "天"
event.startDate = reminder.dueDate
var ending = new Date(reminder.dueDate)
ending.setHours(ending.getHours()+1)
event.endDate = ending
}
}
if(!reminder.dueDateIncludesTime)
event.isAllDay = true
event.save()
}
第三步:设置自动化同步行事历与提醒事项
接着开启iPhone捷径App的自动化功能,新增一个自动化项目,我们要设置让行事历App开启的时候就执行Scriptable脚本把提醒事项同步过去。
选择「行事历 App」打开的时候执行这个自动化捷径脚本,并且勾选「立即执行」。

新增一个空白的自动化操作,在动作的地方搜索 Scriptable。

然后选择刚才我们新增的那个「行事历与提醒事项同步」的这个脚本。

最后按下完成就可以了结束自动化同步的设置。

第四步:开启 iPhone 行事历检视同步效果
接着你就可以开启 iPhone 行事历看看提醒事项的内容有没有被同步过来,第一次开启应该会遇到下面这个权限要求,都同意就好了,但因为刚刚还没给权限,所以同步不会成功。

把 iPhone 行事历关掉再重新打开一次,应该就可以看到 iPhone 行事历和提醒事项的内容有正确同步了。

而且如果已经完成的提醒事项内容,在行事历上面也会被勾起来,让你知道这条已经处理好了。

建议多设置一个特定时间自动同步
如果你有设置 iPhone 行事历的 Widget 小工具在桌面的话,并且习惯看 Widget 小工具的话,我建议大家可以在设置一个每天特定时间自动同步的自动化条件。
因为上面教大家的方法只有在你开启行事历的时候会进行同步,但这样你一早起床想要直接从桌面 Widget 看看今天有什么行程的话,就得先点开一下行事历,让提醒事项同步过去行事历后,Widget 才会显示提醒事项的内容。
如果按照下面这样多设置一个特定时间自动同步的条件。

让 iPhone 行事历和提醒事项在你平常会看行事历的时间之前完成同步,就可以直接在 widget 上看到每天最新的日历内容。

同场加映:可以设置行事历、备忘录与待办事项的App
另外,我们之前也介绍过一款App《Tiny Planner》,这是一款结合了行事历、备忘录以及待办事项的App,让你不用在各个App之间切换来切换去,就能够一口起完全掌握要做的事情,甚至通过备忘录来做纪录。
除了自己手动输入外,也可以和 iPhone 内的行事历同步,更多关于这款《Tiny Planner》的详细介绍可以看下面延伸阅读的链接。

iPhone 行事历自动同步提醒事项:总结
以上就是今天要跟大家分享,让你可以在iPhone行事历开启的时候(或是在特定时间点)自动同步提醒事项的方法,这样就算没有升级到iOS 18也可以在iPhone行事历上面看到有哪些待办事项,甚至是已经完成的也会标示出来让你知道,同时也会显示在Widget小工具上,不需要开启行事历就能够掌握每天的行程以及待处理事项,相当方便。