Я делаю 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"}
Вот процесс скрипта:
uris(http://zotero.org/users/6410528/items/YYTRWPHH)YYTRWPHH).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):
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
http://zotero.org/users/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

Это очень помогает. Итак, это не готовое решение для вашего вопроса, но я не думаю, что вам это действительно нужно, поскольку вам, вероятно, придется рассказать мне больше о том, как это приложение работает, чем это действительно необходимо. Таким образом, этот сценарий фокусируется на вашем первоначальном вопросе о получении кодов полей/результатов из документа слияния.
Я собрал простую рассылку, состоящую из ярлыков и файла данных с 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 строк.
Я пересмотрел свой пост. Не могли бы вы это проверить? Просто мне нужно получить текст из выбранного кода поля, а не весь файл. Спасибо.
Только что посмотрел код цитирования. Я предполагаю, что он вырывает что-то вроде formattedCitation или plainCitation из него. И просто чтобы подтвердить, что вы хотите, это uris?
Да, это uris. Но в моем сценарии я получаю это через Extract URLs from Text. Спасибо за вашу помощь. Я разместил ответ с вашей помощью. Он может заменить VBA идеально!
Благодаря идеям от @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
Очень кратко. Мне это нравится.
@jonsson Я сделал это, но показываю You need at least 15 reputation to cast a vote, but your feedback has been recorded....
Вы упомянули, что работаете над сценарием. Можете ли вы отредактировать свой пост, чтобы включить то, что у вас есть на данный момент?