You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 12:15:01