Функция MacScript не работает должным образом в Office для Mac 2016! Есть идеи?
Мои макросы интенсивно используют MacScript, но, похоже, он не работает ни в одной из последних предварительных сборок Office для Mac 2016
2 ответа
MacScript
команда, используемая для поддержки встроенных сценариев Apple в Office для Mac 2011, устарела. Из-за ограничений песочницы MacScript
Команда больше не может вызывать другие приложения, такие как Finder. Поэтому мы не рекомендуем использовать эту команду. Для случаев, которые требуют изменения существующего кода, чтобы он не использовал MacScript
, вы можете использовать AppleScriptTask
команда (см. ниже).
Новый AppleScriptTask
Команда выполняет скрипт Apple Script. Это похоже на MacScript
за исключением того, что он запускает файл Apple Script, расположенный за пределами изолированного приложения. Вызов AppleScriptTask
следующее:
Dim myScriptResult as String
myScriptResult = AppleScriptTask ("MyAppleScriptFile.applescript", "myapplescripthandler", "my parameter string")
Куда:
- Файл "MyAppleScript.applescript" должен находиться в ~/Library/Application Scripts/[идентификатор пакета]/, расширение appleScript не является обязательным, также может использоваться.scpt
- "Myapplescripthandler" - это имя обработчика скрипта в файле MyAppleScript.applescript
- "Строка моего параметра" - это единственный входной параметр для обработчика сценария "myapplescripthandler".
- Соответствующий Apple Script для Excel будет находиться в файле с именем "MyApple ScriptFile.applescript", который находится в ~/Library/Application Scripts/com.microsoft.Excel/
Примечание. [Идентификатор пакета] для Mac Word, Excel и PowerPoint:
- com.microsoft.Word
- com.microsoft.Excel
- com.microsoft.Powerpoint
Пример обработчика следующий:
on myapplescripthandler(paramString)
#do something with paramString
return "You told me " & paramString
end myapplescripthandler
Я также был очень разочарован поддержкой MacScript в Office для Mac 2016. Возможно, самая неприятная часть - это "обходной путь" создания структуры папок и файлов сценариев. Это нелегко воспроизвести для конечных пользователей и клиентов, которые менее технологичный.
Чтобы решить эту проблему, я создал AppleScript, который работает как установщик, чтобы настроить папку AppleScript и файлы, которые необходимо передать вместе с приложением VBA для работы AppleScriptTask. Я использовал примеры "FileExists" и "FolderExists" с веб-сайта Рона де Брюина ( http://www.rondebruin.nl/mac/applescripttask.htm). Эти две функции приведены ниже и используются для определения того, существует ли файл или папка:
on ExistsFile(filePath)
tell application "System Events" to return (exists disk item filePath) and class of disk item filePath = file
end ExistsFile
on ExistsFolder(folderPath)
tell application "System Events" to return (exists disk item folderPath) and class of disk item folderPath = folder
end ExistsFolder
Вы можете запустить приведенный ниже скрипт, сохранив его в файле с именем "InstallFileFolderScript.scpt". Это делает две вещи:
- Создает структуру папок для сценариев Office 2016 для Mac MS Word: "~/Library/Application Scripts/com.microsoft.Word".
- Создает файл сценария, содержащий две функции "FileExists" и "FolderExists" в текущем рабочем каталоге.
- Копирует файл сценария в папку com.microsoft.Word.
- Удаляет временный скрипт из рабочего каталога после копирования файла.
Не стесняйтесь изменять его, чтобы добавить дополнительные функции, необходимые для приложения. Каждая строка файла сценария написана с использованием этого сценария. Его также можно модифицировать для работы с Excel и другими офисными приложениями:
property theFolders : {"~/Library/'Application Scripts'/com.microsoft.Word"}
try
tell application "Finder" to set targetFolder to (target of the front window) as alias
on error -- no window
set targetFolder to (choose folder)
end try
# build a parameter string from the folder list
set {tempTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, space}
set {theFolders, AppleScript's text item delimiters} to {theFolders as text, tempTID}
do shell script "cd " & quoted form of POSIX path of targetFolder & "; mkdir -p " & theFolders
--Write the Script file if it does not exist
if ExistsFile("~/Library/'Application Scripts'/com.microsoft.Word/FileFolderScript.scpt") is false then
tell application "Finder"
--GET THE WORKING DIRECTORY FOR FILE COPY OF SCRIPT
get folder of (path to me) as Unicode text
set workingDir to POSIX path of result
--Write the new script in the current working directory
set textFile to workingDir & "FileFolderScript.scpt"
--Delete script if it exists
set posixPath to POSIX path of textFile as string
do shell script "rm -rf \"" & posixPath & "\""
--Create File and Folder Script Interface for Microsoft Word VBA Applications
set fd to open for access textFile with write permission
write "on ExistsFile(filePath)" & linefeed to fd as «class utf8» starting at eof
write "tell application \"System Events\" to return (exists disk item filePath) and class of disk item filePath = file" & linefeed to fd as «class utf8» starting at eof
write "end ExistsFile" & linefeed to fd as «class utf8» starting at eof
write "on ExistsFolder(folderPath)" & linefeed to fd as «class utf8» starting at eof
write "tell application \"System Events\" to return (exists disk item folderPath) and class of disk item folderPath = folder" & linefeed to fd as «class utf8» starting at eof
write "end ExistsFolder" & linefeed to fd as «class utf8» starting at eof
close access fd
--Copy the script file into the MACOS-Specific 'safe' folder
set fromPath to quoted form of POSIX path of (workingDir) & "FileFolderScript.scpt"
set toPath to quoted form of "~/Library/'Application Scripts'/com.microsoft.Word"
do shell script "cp -R " & fromPath & space & "~/Library/'Application Scripts'/com.microsoft.Word" with administrator privileges
end tell
end if
--Delete the temp script file from the working directory
set posixPath to POSIX path of textFile as string
do shell script "rm -rf \"" & posixPath & "\""
--Provide confirmation
display dialog "The File and Folder script necessary for Mac OS and Microsoft Office 2016 VBA integration has been successfully installed."
--For use when checking if a file exists
on ExistsFile(filePath)
tell application "System Events" to return (exists disk item filePath) and class of disk item filePath = file
end ExistsFile
Наконец, в приложении VBA я использую это для вызова функций AppleScript:
Function Mac2016_FileOrFolderExists(FileOrFolder As Long, FilePathName As String)
Dim RunMyScript As Boolean
If (FileOrFolder = 1) Then
RunMyScript = AppleScriptTask("FileFolderScript.scpt", "ExistsFile", FilePathName)
Else
RunMyScript = AppleScriptTask("FileFolderScript.scpt", "ExistsFolder", FilePathName)
End If
Mac2016_FileExists = RunMyScript
End Function
Я также нашел эту статью Microsoft очень полезной и простой для понимания: https://dev.office.com/blogs/VBA-improvements-in-Office-2016. В нем подробно описывается использование AppleScriptTask, а также описывается обходной путь разрешений для папок, который обычно приходится применять вместе с AppleScriptTask при работе с файлами / папками.
Удачи в реализации ваших решений! Надеемся, что это поможет другим предоставить макросы, которые будут "просто работать" для их клиента, вместо того, чтобы просить их перепрыгнуть через обходные пути. Вопросы, комментарии и предложения приветствуются!