• Excel 中通过 VBA 调用 applescript 控制运行Mac,可以操作应用,运行 .sh文件 ,构建复杂的工作流。
  • 等价于在 Windows 里用 Shell() 调用 .bat 文件。
  • Mac Excel 2016开始 AppleScript() 命令被弃用,官方说明见参考1。
  • 2 命令结构 AppleScriptTask(arg1, arg2, arg3)

    arg1 = applescript文件的名字

  • 存放位置固定,如果没有,就新建一个。
  • ~/Library/Application Scripts/com.microsoft.Excel/
  • 坑!我没注意前面有~,就建到/Library/Application Scripts/com.microsoft.Excel/,所以后面虽然东西都写对了,运行一直报错。。。直到看到参考资料3,才发现路径是 Users/用户名/
    错误 = 运行时错误“5”:无效的过程调用或参数

    arg2= applescript文件中运行的handler(异步的回调函数/子程序),arg3=传递的参数

  • 仅能运行接受一个参数的函数
  • 在一个applescript如果有几个函数,只运行叫做arg2参数指向的函数
  • 一些保证能理解applescript的说明

  • 使用自带的脚本编辑器测试代码
  • 结构 on end 之间是函数
  • 设置参数赋值是 set x to 1 或者 set x to "a"
  • 后是单行注释

    例一:官方例子,返回拼接的字符串

    on myapplescripthandler(paramString)
    	#do something with paramString 
    	return "You told me " & paramString
    end myapplescripthandler
    

    测试代码就是在applescript里面再写一行 myapplescripthandler("1"),然后运行。

  • 对应的vba代码
  • Sub runAppleSc()
      Dim myScriptResult As String
        myScriptResult = AppleScriptTask("MyAppleScriptFile.scpt", "myapplescripthandler", "1")
        MsgBox myScriptResult
    End Sub
    
    例二:调用一句python语句
    on PythonCommand(pythonScript)
    	do shell script "python -c " & "'" & pythonScript & "'"
    end PythonCommand
    PythonCommand("print(42)")
    

    注意里面的引号,这句python -c后面应接引号,所以用双引号加了一对单引号。

  • 对应的vba代码
  • Sub CallPython()
    Dim result As String
    Dim pythonScript As String
    pythonScript = "print(42)"
    result = AppleScriptTask("PythonCommand.scpt", "PythonCommand", pythonScript)
    MsgBox result
    End Sub
    
    例三:调用一个sh文件
  • .sh文件在 /Users/yourname/Desktop,试运行的时候修改yourname为你的路径。
  • 文件名 1.sh
  • 内容:生成一个内容是2,名字叫1.txt的文件。
  • #!/bin/bash
    echo 2 > /Users/yourname/Desktop/1.txt
    

    注意如果不给全路径,默认的路径并不是文件所在的地方,不知道在哪里,但是是一个需要管理员权限的地方,所以运行会报错。

    applescript

    on runShell(path)
    	do shell script "'" & path & "'"
    end runShell
    set x to "/Users/yourname/Desktop/1.sh"
    runShell(x)
    
  • vba 代码
  • Sub runShell()
        Dim myScriptResult As String
        myScriptResult = AppleScriptTask("path.scpt", "runShell", "/Users/weishuang/Desktop/1.sh")
    End Sub
    

    3 运行说明

  • 只要不报错,就表示运行成功了
  • 输出的结果需要通过赋值获得,如例一,例二
  • 因为有括号,即使没有输出结果,也必须赋值,不然会报错
  • 不想赋值写成 AppleScriptTask arg1, arg2, arg3
  • 4 完整操作

  • VBA中编写代码
  • 确定指定的applescript存放位置存在
  • 指定位置新建applescript文件
  • applescript文件中编写接收一个参数的函数
  • 运行VBA中的代码
  • 5 参考资料

    [1] 官方说明
    [2] 运行Python
    [3] 复杂例子,发现哪里错误
    [4] Applescript简介