如何用JXA从Apple Photos导出照片?解决类型转换错误
解决JXA调用Photos导出图片的“Can't convert types”错误
问题根源分析
你遇到的-1700类型转换错误,主要由三个问题导致:
- 错误启用标准添加:
Photos.includeStandardAdditions = true无效,includeStandardAdditions属于脚本宿主(当前JXA运行环境)而非Photos应用,启用后才能正确处理路径类型转换。 - 参数传递格式错误:Photos的
export方法在JXA中的调用格式不符,不需要把导出列表放在export键下。 - 目标路径类型不符合要求:需要将POSIX路径转换为Photos能识别的
folder类型对象,而非直接用Path()创建的对象。
修正后的代码
const posix_path = "/Users/erik/dev/temp/" // 获取当前脚本宿主并启用标准添加 const app = Application.currentApplication() app.includeStandardAdditions = true const Photos = Application("Photos") // 将POSIX路径转换为Photos可识别的folder对象 const destination = app.pathTo(posix_path) const matchingPhotos = Photos .search({for: "ravens"}) .filter(x => x.filename().match(/(jpeg|jpg|heic)$/i)) if (matchingPhotos.length > 0) { const randomPhoto = matchingPhotos[Math.floor(Math.random() * matchingPhotos.length)] // 导出整个列表的正确调用格式 Photos.export(matchingPhotos, { to: destination }) // 导出单张图片的写法(直接传入单个MediaItem) // Photos.export(randomPhoto, { to: destination }) console.log("导出完成") } else { console.log("未找到匹配的图片") }
关键修改说明
- 启用标准添加:通过
Application.currentApplication()获取脚本宿主,启用includeStandardAdditions后,才能使用pathTo()方法将POSIX路径转换为Apple事件兼容的文件/文件夹对象。 - 修正export调用格式:JXA中
Photos.export()的第一个参数是要导出的媒体项(单个或列表),第二个参数是包含to、usingOriginals等选项的对象,不需要用export键包裹导出列表。 - 路径类型转换:
app.pathTo(posix_path)会将POSIX路径转换为Photos要求的folder类型,避免类型不匹配错误。
额外注意事项
- 如果需要导出原始文件,可在选项中添加
usingOriginals: true,例如:Photos.export(matchingPhotos, { to: destination, usingOriginals: true }) - JXA的Photos相关文档确实较少,可通过AppleScript字典反向推导JXA的调用逻辑(AppleScript与JXA的Apple事件调用逻辑基本一致,仅语法不同)。
内容的提问来源于stack exchange,提问作者heckman
相关产品推荐
相关产品推荐

