通过Node.js运行JavaScript访问Apple Numbers的报错问题咨询
错误原因
你在Apple脚本编辑器中运行的是JXA(JavaScript for Automation),这是macOS专属的自动化脚本运行环境,Application是JXA的内置全局API,Node.js运行环境默认不提供该API,因此直接迁移代码会抛出未定义错误。
解决方案
方案1:Node.js环境安装依赖调用JXA
- 安装npm包
run-jxa,该工具可以在Node.js中调用系统JXA能力操作macOS原生应用 - 代码拆分:文件读取逻辑保留在Node.js侧,Numbers操作逻辑封装为JXA代码块通过
run-jxa调用,参考实现如下:
const runJxa = require('run-jxa'); const fs = require('fs'); const readline = require('readline'); const principalDateArray = []; const principalValueArray = []; const rl = readline.createInterface({ input: fs.createReadStream('../CSV/largecap.csv') }); // CSV读取完成后执行JXA操作Numbers rl.on('close', async () => { await runJxa((dateArr, valueArr) => { // 该函数内的代码会在JXA环境中运行 const Numbers = Application('Numbers'); const principalData = Numbers.documents[0].sheets[2].tables["Principal"]; const arrayLength = dateArr.length; for(let i = 0; i < arrayLength; i++){ principalData.rows[i].cells[2].value = dateArr[i]; principalData.rows[i].cells[3].value = valueArr[i]; } }, [principalDateArray, principalValueArray]); }); rl.on('line', line => { const tempArray = line.split(','); principalDateArray.push(tempArray[0]); principalValueArray.push(tempArray[1]); });
该方案仅支持macOS设备运行,依赖系统自带的JXA运行时
方案2:无需迁移到Node.js,直接在JXA中实现文件读取
JXA本身内置了文件读写API,不需要切换到Node.js环境,原有操作Numbers的代码可以完全保留,只需要补充CSV读取逻辑即可。
另外你现有代码存在错误:let arrayLength = principalDateArray.rows.Length; 中principalDateArray是自定义普通数组,没有rows属性,直接取.length即可。
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

