日歷 提醒事項同步 縫補(bǔ)后的版本
全是看評論區(qū)大神們關(guān)于各類問題的答復(fù)修改而來(如有侵權(quán)請私信我刪除
已完成的日程不會顯示在前天,會正常出現(xiàn)在日歷當(dāng)天時間表
待辦默認(rèn)一個小時,本人用的笨方法是在待辦設(shè)置子任務(wù),3個小時就設(shè)。。比如要背單詞3小時,就設(shè)置背單詞主任務(wù)?子任務(wù)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(`日歷的結(jié)束時間 ${endDate.toLocaleDateString()}`)
const reminders = await Reminder.allDueBetween(startDate, endDate)
console.log(`獲取 ${reminders.length} 條提醒事項`)
var calendar = await Calendar.forEvents()
//獲取日歷名和對應(yīng)的日歷
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的標(biāo)識符
const targetNote = `[Reminder] ${reminder.identifier}`
const [targetEvent] = events.filter(e => e.notes != null && e.notes.includes(targetNote))//過濾重復(fù)的reminder
if(!m_dict[reminder.calendar.title])
{
console.warn("找不到日歷"+ reminder.calendar.title)
continue
}
if (targetEvent) {
//console.log(`找到已經(jīng)創(chuàng)建的事項 ${reminder.title}`)
updateEvent(targetEvent, reminder)
} else {
console.warn(`創(chuàng)建事項 ${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 = " 準(zhǔn)時完成"
}
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) + "天"?
//如果不是在同一天,設(shè)置為全天事項
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()
}