Получить текст выбранного кода поля в Microsoft Word с помощью AppleScript

Я делаю Automator для перехода от цитирования в Word к справочному программному обеспечению (Zotero). Но я не могу найти AppleScript для извлечения текста выбранного кода поля (первый шаг).

Код поля в Word

ADDIN ZOTERO_ITEM CSL_CITATION {"citationID":"AFUiwuqi","properties":{"formattedCitation":"[1]","plainCitation":"[1]","noteIndex":0},"citationItems":[{"id":9752,"uris":["http://zotero.org/users/6410528/items/YYTRWPHH"],"itemData":{"id":9752,"type":"article-journal","container-title":"Nature","DOI":"10.1038/s41586-019-1737-7","ISSN":"0028-0836, 1476-4687","issue":"7782","page":"324-329","title":"Controlled flight of a microrobot powered by soft artificial muscles","volume":"575","author":[{"family":"Chen","given":"Yufeng"},{"family":"Zhao","given":"Huichan"},{"family":"Mao","given":"Jie"},{"family":"Chirarattananon","given":"Pakpong"},{"family":"Helbling","given":"E. Farrell"},{"family":"Hyun","given":"Nak-seung Patrick"},{"family":"Clarke","given":"David R."},{"family":"Wood","given":"Robert J."}],"issued":{"date-parts":[["2019",11,14]]}}}],"schema":"https://github.com/citation-style-language/schema/raw/master/csl-citation.json"} 

Вот процесс скрипта:

  1. Извлечь текст из выбранного кода поля в Word (это вопрос)
  2. Получить текст uris(http://zotero.org/users/6410528/items/YYTRWPHH)
  3. Получите коды предметов (YYTRWPHH).
  4. Открыть URL (zotero://select/library/items?itemKey=YYTRWPHH)

Теперь я использую VBA для извлечения текста кода поля, см. ниже. Но таким образом файл будет изменен. Поэтому я хочу сделать это через AppleScript.

Sub GetFiledsCodes()
    Dim myRange As Range, myCodes As String
    Set myRange = Selection.Range
    With myRange
        If .Fields.Count = 0 Then
            MsgBox "No Code!", vbInformation
            Exit Sub
        Else
            .Fields.Update
            .TextRetrievalMode.IncludeFieldCodes = True
            .TextRetrievalMode.IncludeHiddenText = True
            myCodes = .Text
            myCodes = VBA.Replace(myCodes, Chr(19), "{")
            myCodes = VBA.Replace(myCodes, Chr(21), "}")
            .SetRange .End, .End
            .InsertAfter myCodes
            .Font.Name = "Times New Roman"
            .Font.Size = 12
            .Cut
        End If
    End With
End Sub

PS:

Вот мой процесс в Automator (он может работать, но с использованием VBA):

  1. Запустить AppleScript
    on run {input, parameters}
        tell application "Microsoft Word" to activate
        tell application "Microsoft Word"
            run VB macro macro name "GetFiledsCodes"
            delay 0.5
        end tell
        return input
    end run
    
  2. Получить содержимое из буфера обмена
  3. Извлечь URL-адреса из текста
  4. Абзацы фильтров начинаются с http://zotero.org/users/
  5. Скопировать в буфер обмена
  6. Запустить AppleScript
    set myStr to do shell script "pbpaste"
    tell application "Zotero" to activate
    set AppleScript's text item delimiters to "
    "
    set myList to every text item of myStr
    set zoterocode to ""
    set codes to ""
    repeat with j from 1 to the length of myList
        set itemValue to item j of myList
        set zoterocode to (do shell script "sed -E 's#http://zotero.org/users/[0-9]+/items/##g' <<< " & itemValue)
        if j = 1 then
            set codes to zoterocode
        else
            set codes to codes & "," & zoterocode
        end if
    end repeat
    tell application "System Events"
        key code 18 using {command down, control down, option down}
        delay 0.5
        set collectionKey to do shell script "pbpaste"
        if collectionKey = myStr then
            set theurl to "zotero://select/library/items?itemKey = " & codes
        else
            set theurl to collectionKey & "/items?itemKey = " & codes
        end if
        open location theurl
    end tell
    

Вы упомянули, что работаете над сценарием. Можете ли вы отредактировать свой пост, чтобы включить то, что у вас есть на данный момент?

Mockman 24.01.2023 13:37
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
1
67
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это очень помогает. Итак, это не готовое решение для вашего вопроса, но я не думаю, что вам это действительно нужно, поскольку вам, вероятно, придется рассказать мне больше о том, как это приложение работает, чем это действительно необходимо. Таким образом, этот сценарий фокусируется на вашем первоначальном вопросе о получении кодов полей/результатов из документа слияния.

Я собрал простую рассылку, состоящую из ярлыков и файла данных с 8 записями, в каждой из которых по 5 полей: {"«Фамилия»», «Название должности», «Компания», «Город»», ««Веб»»}. Последнее является ключевым полем.

По сути, сценарий проходит через документ слияния данных и сначала циклически проходит через его поля, затем веб-поле и, наконец, веб-адреса.

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

Кстати, вполне вероятно, что вы можете избежать некоторых сценариев оболочки, но я пока не могу сказать, как это сделать. Очевидно, что в сценарии есть некоторые излишества, и его можно было бы доработать, но я думаю, что он демонстрирует, как извлекать необходимую информацию. Взгляните на него и дайте мне знать, какие проблемы требуют решения.

tell application "Microsoft Word"
    set d1 to document "cardo_labels.docx"
    
    set fContents to {} -- list of mergefield
    set fResRange to {} -- list of result range, i.e. field merge data
    repeat with x from 1 to (count of fields of d1)
        set fcs to content of field code of field x of d1 --> " MERGEFIELD LastName "
        set frr to content of result range of field x of d1 --> "Smith"
        if fcs is not " NEXT " then -- ignore «Next Record»
            set end of fContents to fcs
            set end of fResRange to frr
        end if
    end repeat
    --> single record example
    fContents --> {" MERGEFIELD LastName ", " MERGEFIELD JobTitle ", " MERGEFIELD Company ", " MERGEFIELD City ", " MERGEFIELD Web "}
    fResRange --> {"Smith", "President", "Acme Screw & Gear", "Metz", "http://zotero.org/users/1234/items/smith-metz"}
    -- NB when not displaying 'merged data', fResRange will appear thusly: {"«LastName»", "«JobTitle»", "«Company»", "«City»", "«Web»"}
    
    set webList to {}
    repeat with y from 1 to (count of fResRange)
        if item y of fResRange begins with "http://zotero.org/users/" then
            set end of webList to (item y of fResRange)
        end if
    end repeat
    --> {"http://zotero.org/users/1234/items/smith-metz"}
    --> {"http://zotero.org/users/1234/items/smith-metz", "http://zotero.org/users/4222/items/branson-metz", "http://zotero.org/users/3236/items/house-metz", "http://zotero.org/users/3342/items/kurtz-london", "http://zotero.org/users/12345/items/jones-london"}
    
    set urlPiece to {}
    set AppleScript's text item delimiters to "/"
    repeat with z in webList
        set end of urlPiece to last text item of z
    end repeat
    -- contents of z
    --> "http://zotero.org/users/1234/items/smith-metz"
    set AppleScript's text item delimiters to ""

    urlPiece
    --> {"smith-metz"}
    --> {"smith-metz", "jones-saopaolo", "branson-metz", "house-metz", "kurtz-london", "jones-london"}
    
end tell

Благодарю за ваш ответ. Я проверил ваш код, и код возвращает [1] вместо текста кода поля, пока я использую первые 17 строк.

heihei Han 25.01.2023 17:56

Я пересмотрел свой пост. Не могли бы вы это проверить? Просто мне нужно получить текст из выбранного кода поля, а не весь файл. Спасибо.

heihei Han 25.01.2023 18:38

Только что посмотрел код цитирования. Я предполагаю, что он вырывает что-то вроде formattedCitation или plainCitation из него. И просто чтобы подтвердить, что вы хотите, это uris?

Mockman 25.01.2023 19:32

Да, это uris. Но в моем сценарии я получаю это через Extract URLs from Text. Спасибо за вашу помощь. Я разместил ответ с вашей помощью. Он может заменить VBA идеально!

heihei Han 25.01.2023 19:52
Ответ принят как подходящий

Благодаря идеям от @Mockman.

В сочетании с выделением, вот способ извлечения текста из выбранного кода поля через AppleScript:

tell application "Microsoft Word"
    tell selection
        set fcs to content of field code of field of text object
    end tell
end tell
fcs

Очень кратко. Мне это нравится.

Mockman 25.01.2023 20:12

@jonsson Я сделал это, но показываю You need at least 15 reputation to cast a vote, but your feedback has been recorded....

heihei Han 25.01.2023 22:31

Другие вопросы по теме