Возврат значения с помощью Applescripttask (Word для Mac 2016)

Я начал обновлять надстройку для Word для Mac 2016, и неудивительно, что все идет не так хорошо. Может ли кто-нибудь помочь в том, что может быть не так с этим яблочным скриптом (или моим методом его вызова)? Я хорошо разбираюсь в VBA, но очень новичок в Applescript. Это должно найти файл или файлы и вернуть строку имен файлов с разделителями-запятыми. Я могу сказать, что сам Applescript работает, как и ожидалось (уведомление появляется и дает правильное значение). Но значение, похоже, не передается в VBA, который, похоже, получает пустую строку (хотя это трудно сказать, учитывая ограничения VBE в Word 2016 для Mac).

VBA (упрощено для краткости):

#If MAC_OFFICE_VERSION >= 15 Then
  Dim args As String, MyFiles As String
  'These variables have been set elsewhere and I can confirm with Debug.Print that they are as expected.
  args = MyBrowseTypes & ";" & browseMulti & ";" & browsePath
  MyFiles = Applescripttask("scrHelperAS.scpt", "browseFiles", args)
  ' This prints true, for what that's worth
  If MyFiles = "" Then
    Debug.Print "True"
  Else: Debug.Print "False"
  End If
#End If

Applescript (это находится в файле с именем, указанным выше, в правильном месте):

on browseFiles(argString)
  --open file browser and return selection
  set {sFileType, bMultiples, sDefPath} to SplitString(argString, ";")
  set sFileTypes to SplitString(sFileType, ",")
  if bMultiples is "true" then
    set thePrompt to "Please select a file or files"
  else
    set thePrompt to "Please select a file"
  end if

  set AppleScript's text item delimiters to ","
  set theFiles to (choose file of type sFileTypes with prompt thePrompt multiple selections allowed bMultiples default location alias POSIX file (sDefPath)) as string
  ' I don't know if this is/should be necessary, added to try to fully coerce the return value to a string. Didn't work without it, still doesn't work with it.
  set theFilesStr to joinList(theFiles, ",")
  set AppleScript's text item delimiters to ""

  display notification theFilesStr with title "Files"
  return theFilesStr
end browseFiles

Я внес небольшие изменения в уведомление, чтобы убедиться, что это не какая-то проблема с кэшированием Applescript. Браузер файлов в основном работает (иногда он зависает и не позволяет сделать выбор, но это, похоже, отдельная проблема). Я попытался использовать «указать приложению «Системные события» вернуться», как я видел на очень полезном сайте Рона ДеБрюина, но это не имело значения. Я также попытался вызвать очень, очень простой Applescript в стиле «Hello world», чтобы убедиться, что я вообще могу что-либо вернуть, и это сработало (вероятно, бесполезно, но здесь это):

on simple(sometext)
  set myText to "Yo"
  display notification myText with title "Hello"
  return myText
end simple

Это только первый шаг в большом процессе, и теперь я немного волнуюсь. Надеюсь, кто-то может указать на какую-то глупую ошибку, чтобы я мог двигаться дальше.

(Для справки: большую часть своей надстройки я разрабатываю в Word 2010, но она работает и в Word 2011. Итак, у меня есть много вызовов MacScript, которые я пытаюсь обновить для Word 2016.)


person Christina    schedule 10.05.2016    source источник


Ответы (1)


Может быть, это ошибка или проблема безопасности, я не знаю, но вы не можете использовать команды (choose ..., display dialog или display alert) при использовании AppleScriptTask из сценария VBA, результатом AppleScriptTask всегда будет пустой нить.

Таким образом, вы можете использовать эти команды, когда вам не нужен результат в переменной VBA.


Пример (результатом команды AppleScriptTask является пустая строка при запуске этого AppleScript):

on simple(sometext)
    set myText to sometext as string 
    display notification myText with title "Hello"
    return text returned of (display dialog "Type some word" default answer myText)
end simple

Вы можете использовать команду MacScript() для выбора файла (она по-прежнему работает в Microsoft Office 2016):

browsePath = "/Users/myUserName/Documents/someFolder/"
MyBrowseTypes = """xls"", ""doc"""
browseMulti = True
If browseMulti Then
    myPrompt = "Please select a file or files"
Else
    myPrompt = "Please select a file"
End If
myScript = "set theFiles to (choose file of type {" & MyBrowseTypes & "} " & _
            "with prompt """ & myPrompt & """ default location (""" & _
            browsePath & """ as posix file as alias) multiple selections allowed " & browseMulti & ")" & vbNewLine & _
            "set {TID, text item delimiters} to {text item delimiters, "",""}" & vbNewLine & _
            "set theFiles to theFiles as text" & vbNewLine & _
            "set text item delimiters to TID" & vbNewLine & _
            "return theFiles"

MyFiles = MacScript(myScript)
Debug.Print MyFiles
person jackjr300    schedule 10.05.2016
comment
Спасибо! Я понятия не имел, что MacScript все еще подходит для некоторых задач. - person Christina; 11.05.2016