欢迎光临散文网 会员登陆 & 注册

日历 提醒事项同步 缝补后的版本

2023-07-03 11:50 作者:拖到最后一秒  | 我要投稿

全是看评论区大神们关于各类问题的答复修改而来(如有侵权请私信我删除

已完成的日程不会显示在前天,会正常出现在日历当天时间表

待办默认一个小时,本人用的笨方法是在待办设置子任务,3个小时就设。。比如要背单词3小时,就设置背单词主任务➕子任务2个(分别3个开始时间)

原方法教程来自知乎专栏:https://zhuanlan.zhihu.com/p/169566930

观看视频:【IOS|终极解决方案!一键同步ios【提醒事项】到【日历】-哔哩哔哩】 https://b23.tv/skgaq15

目前ipados 16.5.1 可正常使用

代码如下

var dur_month = 2

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 = false

event.startDate = reminder.dueDate

// event.endDate=reminder.dueDate

// var ending = new Date(reminder.dueDate)

// 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()

}


日历 提醒事项同步 缝补后的版本的评论 (共 条)

分享到微博请遵守国家法律