Excel Mac 2016 调用 Applescript 后是单行注释

1 概述

  • 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”:无效的过程调用或参数

Excel Mac 2016 调用 Applescript
后是单行注释

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

  • 仅能运行接受一个参数的函数
  • 在一个applescript如果有几个函数,只运行叫做arg2参数指向的函数

一些保证能理解applescript的说明

  1. 使用自带的脚本编辑器测试代码
  2. 结构 on end 之间是函数
  3. 设置参数赋值是 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
Excel Mac 2016 调用 Applescript
后是单行注释
例二:调用一句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
Excel Mac 2016 调用 Applescript
后是单行注释
例三:调用一个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 完整操作

  1. VBA中编写代码
  2. 确定指定的applescript存放位置存在
  3. 指定位置新建applescript文件
  4. applescript文件中编写接收一个参数的函数
  5. 运行VBA中的代码

5 参考资料

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