相信有不少人都會將臨時代辦事項記錄在 iPhone「提醒事項」App內,如果想要將 iOS「提醒事項」自動同步到「行事曆」內要怎麼做?同步功能似乎需要依賴第三方 App 才能達成,那有沒有免費又能快速解決的方案?
其實要讓 iOS 提醒事項與行事曆同步透過捷徑自動化就能輕鬆實現,這篇就來分享搭配自動化 Scripts 腳本,實現每次透過 iPhone 提醒事項紀錄生活瑣碎的事情,都能自動同步到行事曆內。
通常 iOS 內建「提醒事項」App,如果要將代辦事項同步到行事曆內,都要手動點選才能搬移加入,這種做法非常不人性化,反而比較推薦讓行事曆與提醒事項同步會更智慧又省時,實現效果如下畫面,當 iPhone 在提醒事項內增加後,就會立即同步到行事曆內,省去要手動搬移的步驟,實現步驟可參考底下iPhone行事曆如何同步提醒事項教學:
如何將 iPhone行事曆同步提醒事項教學
本篇教學不管是 iPhone 或 iPad 設備都能使用,系統需 iOS 14 或 iPadOS 14 或以上。
1. 替iOS行事曆與提醒事項建立相同列表
要實現 iPhone 行事曆與提醒事項同步功能,要在兩款 App 內都建立相同的列表名稱,後續才能同步。
先打開「提醒事項」App,點選右下角「新增列表」,自訂想同步的列表名。
接下來開啟 iOS 內建「行事曆」App,點選底下「行事曆」會進入行事曆列表清單,點選左下角「加入行事曆」。
輸入與「提醒事項」App 相同的列表名稱,按下右上角「完成」,後續想將重要事情紀錄在同步的列表內即可。
2. 建立 Scripts 同步腳本
為了能夠實現 iPhone 內建行事曆與提醒事項同步,我們需要利用「Scripts App」來運行自動化 JavaScript 腳本。
下載並且打開「Scripts」App,點選右上角「+」新增按鈕,會出現新的腳本頁面,點擊上方「Untitled Script」文字後,將名稱改為「提醒事項同步行事曆」。
並且將後面的iOS 提醒事項同步行事曆代碼直接複製貼上,按下「Done」關閉。
iOS 提醒事項同步行事曆代碼
腳本原作者:汀力
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() }
會看見「提醒事項同步行事曆」Scripts 腳本後,就可以退回主畫面。
3. 建立捷徑自動化
開啟「捷徑」App ,點選「自動化」>「製作個人自動化操作」,選擇「App」。
按下「App」按鈕,搜尋並且勾選「提醒事項」和「行事曆」。
最後確定自動化操作是否設定為「已開啟」,就可以按「下一步」。在動作編輯頁面中,點選「加入動作」。
利用搜尋找到「Scriptable」,並且從 Run Script 內選擇剛創建的 JavaScript 自動化腳本。
最後點擊「下一步」。
會進入自動化執行設定頁面,將「執行前先詢問」和「執行時通知」兩項功能都關閉,最後點擊「完成」。
4. 排除自動化錯誤
以上步驟就能實現打開內建「行事曆」或「提醒事項」App,就會立即自動同步,不過 Sctiptable 沒有設定好權限,會導致執行腳本會出現「找不到日曆錯誤」情況,會發現兩個 App 之間沒辦法同步,底下告訴大家解決方法。(此步驟一定要做)
先打開 iOS 內建「設定」,找到「Scriptable」控制設定,將「行事曆」和「提醒事項」關閉再次開啟,偏好語言設定為「英文」。
都設定完成後,將 iPhone 重開機一次,打開「Scriptable」App 執行「提醒事項同步行事曆」腳本,觀察 Log 如果沒有跳出任何黃字錯誤,能夠正常運行就代表已經成功。
5. 實現行事曆與提醒事項同步
以上全部都設定完成後,後續只要打開「行事曆」或「提醒事項」其中一款 App 就會立即同步,只要紀錄在「提醒事項」App 的未完成的代辦事項,就會立即同步到「行事曆」App 內,甚至會顯示還剩多少時間。
要是完成的代辦事項,在行事曆內也會看間打勾狀態,透過行事曆也能清楚知道今天有哪些未完成的工作,不管是日常生活、工作或學業都很方便。
要是打開行事曆 App 沒有出現提醒事項的項目,檢查「提醒事項」內是否有設定日期時間,或是將行事曆 App 從後台關閉再次打開就可以,當然也可以建立好幾組提醒事項列表,只要行事曆有對應的名稱兩邊就能夠同步。
如何刪除行事曆內的提醒事項項目?
要是有些提醒事項已經完成,還是會一直顯示在 iOS 行事曆內要怎麼刪除?這部分要透過刪除提醒事項的項目才能移除,操作方法如下:
打開「提醒事項」App 的項目,按下右上角「•••」>「顯示已完成的項目」。
列表就會顯示已經完成的代辦事項,往左滑動選擇「刪除」已經完成的事項,就能夠將行事曆已完成的項目也移除。
功能總結
透過這篇技巧後,就可以讓 iPhone行事曆與提醒事項進行同步功能,而且免費又方便,只要有新增移除和編輯動作,一切透過提醒事項內操作就可以,行事曆只是單純顯示。
更多實用技巧:
喜歡這篇文章教學,後續想了解更多Apple資訊、iPhone、Mac、3C隱藏技巧,歡迎追蹤 瘋先生FB粉絲團、瘋先生LINE@、訂閱瘋先生Google新聞、Telegram、Instagram以及 訂閱YouTube頻道,將會有更多非常實用的技巧教學分享給大家。