Home > Back-end >  Get text of selected field code in Microsoft Word using AppleScript
Get text of selected field code in Microsoft Word using AppleScript

Time:01-26

I'm making a Automator to jump from citation in Word to the reference software(Zotero). But I can't find a AppleScript to extract text of selected field code (the first step).

The field code in Word is

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"} 

Here is the script process:

  1. Extract text from selected field code in Word (This is the question)
  2. Get the uris text(http://zotero.org/users/6410528/items/YYTRWPHH)
  3. Get the item-codes (YYTRWPHH).
  4. Open url (zotero://select/library/items?itemKey=YYTRWPHH)

Now I use VBA to extract field code text, see below. But in this way, the file will be changed. So I want to do this via 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:

Here is my process in Automator(it can work but using VBA):

  1. Run 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. Get contents from clipboard
  3. Extract URLs from Text
  4. Filter Paragraphs begin with http://zotero.org/users/
  5. Copy to Clipboard
  6. Run 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
    

CodePudding user response:

That helps a lot. Okay, so this isn't a turnkey solution for your question but I don't think you really need that as you'd probably end up having to tell me more about how this app works than is really necessary. So this script focuses on your initial question about getting the field codes/result ranges from a merge document.

I put together a simple mail merge consisting of labels and a data file with 8 records, each of which have 5 fields: {"«LastName»", "«JobTitle»", "«Company»", "«City»", "«Web»"}. The latter is the key field.

Basically, the script runs through the data merge document and cycles first through its fields, then the web field, and finally the web addresses.

Based on your script, I can't really determine what you are doing with each address so it finishes by collecting just the final part of each address in a list. The obscure parts for me are the pbpastes, the codes and the whole System Events block. This area would need tweaking.

Incidentally, it's quite likely that you can avoid some of the shell scripts but I can't say how yet. Obviously the script has some redundancies and could be further refined but I think it demonstrates how to extract the information you need. Take a look at it and let me know what issues there are that need addressing.

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

CodePudding user response:

Thanks to ideas from @Mockman.

Combining with the selection, here is the way to extract text from selected field code via AppleScript:

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