ios 提醒事项同步日历快捷指令脚本

  • AppStore 安装运行脚本的软件 scriptable

scriptable https://docs.scriptable.app

const 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
}

const events = await CalendarEvent.between(startDate, endDate, calendar)
console.log(`获取 ${events.length} 条日历`)

for (const reminder of reminders) {
    //reminder的标识符
    const id = reminder.identifier.split('-')[0]
    const targetNote = `🍧 ${id} 🍰`
    // 添加标识符存进备注 用来防止重复添加
    const [targetEvent] = events.filter(
        (e) => e.notes != null && e.notes.indexOf(targetNote) != -1
    ) //过滤重复的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()
        const notes = reminder.notes ? reminder.notes : ''
        newEvent.notes = targetNote + '\n\n' + 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
    //已完成事项
    if (reminder.isCompleted) {
        event.title = `✅ ${reminder.title}`
        event.isAllDay = false
        event.startDate = reminder.completionDate
        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)
        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
        }
    }
    event.save()
}
  • 提醒事项数据格式
{
  "identifier": "29803A1E-6C2F-454D-B366-2C67EB1F24BD",
  "title": "Recite word",
  "isCompleted": false,
  "isOverdue": true,
  "priority": 0,
  "dueDate": "2021-03-11T23:20:00.000Z",
  "dueDateIncludesTime": true,
  "completionDate": null,
  "creationDate": "2021-03-12T03:28:00.621Z",
  "calendar": {
    "identifier": "282088E0-DC16-4827-BA21-9B9FD5F0A16F",
    "title": "Learn",
    "isSubscribed": false,
    "allowsContentModifications": true,
    "color": {
      "hex": "FF2968",
      "red": 1,
      "green": 0.1607843041419983,
      "blue": 0.40784314274787903,
      "alpha": 1
    }
  }
}

ios 提醒事项同步日历快捷指令脚本

你是哪种程序员?

1.对待需求的态度

优秀程序员 :在有需求与任务时,会不断的询问需求与任务,并且多次确认想要的结果,再动手写代码。

一般程序员 :接到任务就闷头写代码,反
正做错了也是你们要求的,不是我的锅。

2.编码习惯

优秀程序员 :他的代码读起来是赏心悦目的,若遇到难理解的实现点时,他也会写下清晰的注释来帮助后来人理解。

一般程序员 :我有我的代码风格,我看得懂就行了。几个月后我也看不懂了,那就重写一遍吧。

3. 善于学习

优秀程序员 :遇到没接触过的技术时,他会主动搜索资料去学习钻研,并以此为乐趣。

一般程序员 :疯狂地找插件,类库和框架,常常做代码搬运工,安慰自己不要造轮子。

4. 对工作精益求精

优秀程序员 :会抽时间review自己的代码,并思考如何提高性能。

一般程序员 :只喜欢开发新项目,不喜欢维护旧项目,万一搞崩了呢?

5. 有钻研精神

优秀程序员 :遇到问题,会考虑独立寻求解决办法,提升自己处理问题的能力。

一般程序员 :喜欢把问题交给别人,把代码发给被人,让别人帮他找问题。

6. 良好的情绪管理

优秀程序员 :理解需求是会不断变化的,不会把消极情绪表达出来,能控制好情绪,能跟产品经理和谐愉快沟通。

一般程序员 :因为需求反复修改就索性说这个代码实现不了。

7. 态度很谦虚

优秀程序员 :对新的技术敏感度,保持学习的热情,而且为人很谦虚,不觉得自己有多牛。

一般程序员 :生怕别人不觉得他是大牛,到处瞎逼逼。

Mac 设置环境变量 path 的几种方法

Mac系统的环境变量,加载顺序为:

  1. 系统
    • /etc/profile
    • /etc/paths

/etc/profile/etc/paths 是系统级别的,系统启动就会加载

  1. 用户
    • ~/.bash_profile
    • ~/.bash_login
    • ~/.profile
    • ~/.bashrc

按照从前往后的顺序读取,如果 ~/.bash_profile 文件存在,则后面的几个文件就会被忽略不读了,如果 ~/.bash_profile 文件不存在,才会以此类推读取后面的文件。~/.bashrc 没有上述规则,它是 bash shell 打开的时候载入的

如果没特殊说明,设置PATH的语法都为:

export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:<PATH N>
阅读更多

占位图

写页面的有时候需要一些临时的占位符图片,下面是常用的几种免费占位图片网站

picsum.photos (https://picsum.photos/)

支持https, 而且图片特别多, 随机图片, 模糊图片, 宽高, 唯一的缺点就是感觉请求有点慢

图片地址 说明
https://picsum.photos/list 查看所有图片
https://picsum.photos/200 正方形图片 只想要一个值
https://picsum.photos/200/300 设置宽高
https://picsum.photos/500/300/?random 随机获取图片
https://picsum.photos/id/0/200/300 指定特定图片
https://picsum.photos/g/200/300 将图片变成灰色 只需要加一个 /g/
https://picsum.photos/200/300/?blur 模糊图片
![](/images/?random~)

fakeimg.pl(https://fakeimg.pl)

如果你只需要使用文字,这个就特别好用了, 支持背景颜色,文字颜色,文字样式, 他的访问速度还很快

图片地址 说明
https://fakeimg.pl/400x300 设置宽高
https://fakeimg.pl/400x300/ba8f6c/FFFFFF/ 设置背景颜色 字体颜色
https://fakeimg.pl/400x300/ba8f6c/FFFFFF/?text=text 设置显示的文字
https://fakeimg.pl/400x300/ba8f6c/FFFFFF/?text=RegExp&font=noto 设置字体样式 font=lobster
![](/images/?text=糖小米&font=noto~)