macOS JXA调用Things3的schedule方法报错:Named parameters must be passed as an object
问题描述
我尝试使用JXA(Javascript for macOS automation,macOS平台的JS自动化框架)实现macOS下任务管理工具Things 3的自动化功能,运行时遇到报错,花费大量时间自行排查、求助他人都未解决。
我要调用官方文档中描述的如下schedule方法:
调用代码如下:
// Set TaskApp as the app to use var TaskApp = Application('Things3'); // Get the ToDo from toDos var task = TaskApp.toDos["test555342343"] // Get today as a date var today = new Date() // Schedule the task for Today task.schedule(task.id(), {for: today})
运行后返回报错:Error: Error: Named parameters must be passed as an object.
调用其他方法(比如show)时可以正常运行:
可正常运行的示例代码:
// Set TaskApp as the app to use var TaskApp = Application('Things3'); // Get the ToDo from toDos var task = TaskApp.toDos["test555342343"] // Bring Things3 to the Forground TaskApp.activate() // Show the task task.show(task.id())
上述代码可以正常打开选中的待办事项,创建任务时给deadline传入date对象也可正常生效,生成对应截止日期的任务。
该文档仅可在安装了Things3的macOS设备上引用脚本库查看,上述报错同样出现在调用move方法时:传入List Object作为参数也会触发相同错误。
解决方案
该报错由两个JXA的语法问题导致:
- 实例方法不需要额外传入实例标识作为首参数
你已经通过TaskApp.toDos["test555342343"]获取到了目标任务的实例对象,调用该实例的方法时默认作用于当前实例,不需要再把任务ID作为第一个参数传入。 - JS保留字作为对象属性名必须加引号包裹
for是JavaScript的保留关键字,直接作为对象的键名使用会触发语法解析异常,需要用引号包裹该属性名。
修改后的可运行代码如下:
var TaskApp = Application('Things3'); var task = TaskApp.toDos["test555342343"] var today = new Date() // 移除首参数id,给保留字for加引号 task.schedule({"for": today})
move方法的调用遵循相同规则,示例如下:
var TaskApp = Application('Things3'); var task = TaskApp.toDos["test555342343"] // 假设要移动到收件箱列表 var targetList = TaskApp.lists["收件箱"] // 同样不需要传id,参数键名如果是保留字要加引号 task.move({"to": targetList})
内容的提问来源于stack exchange,提问作者GeistInTheBASH
相关产品推荐
相关产品推荐

