Что касается загрузки из исходного файла, это может быть проблемой.Мне не удалось найти ничего о том, как AHK напрямую взаимодействует с Google Sheets.Если у вас все в порядке с экспортом файла во что-то вроде CSV, то вы можете читать из него с помощью FileRead
и делать с ним все, что захотите.В приведенном ниже примере используется ваш файл, который я экспортировал на свой рабочий стол как CSV.Он использует первую строку для первого списка и выводит оставшуюся часть вместе для использования во втором списке.
FileRead , sCSVRaw , %A_Desktop%/AHK list.csv
Loop , Parse , sCSVRaw , `n
{
If A_Index = 1
{
sHeader := RegExReplace( A_LoopField , ",|`r" , "|" )
Continue
}
sDataDump .= A_LoopField
}
sDataDump := StrReplace( sDataDump , "`r" , "," )
Для основной части вашего вопроса я бы подошел к этому, имея ваш монитор сценариев длянекоторые нажатия клавиш с использованием функции OnMessage()
, а затем выполнение необходимых действий после обнаружения соответствующего нажатия клавиш.
OnMessage( 0x203 , "f_DblClick" ) ; Monitors left doubleclick
OnMessage( 0x100 , "f_KeyPress" ) ; Monitors keypresses (specifically, keyup events)
Когда у меня появится возможность, я добавлю рабочий пример. РЕДАКТИРОВАТЬ: У меня есть шанс;вот, пожалуйста:
aData := []
FileRead , sCSVRaw , %A_Desktop%/AHK list.csv
Loop , Parse , sCSVRaw , `n
{
If A_Index = 1
{
sHeader := RegExReplace( A_LoopField , ",|`r" , "|" )
Continue
}
++nCt
Loop , Parse , A_LoopField , `,
aData[ A_Index , nCt ] := RegExReplace( A_LoopField , "`r" , "" )
}
Gui , +AlwaysOnTop
Gui , Add , ListBox , x20 y20 w180 r10 Choose1 vList1 AltSubmit gSubmit1 , %sHeader%
Gui , Add , ListBox , x+40 w200 r10 vList2 AltSubmit gSubmit2 ,
Gui , Show , x800 y150 w500 h200 , Helper HS
OnMessage( 0x100 , "f_KeyPress" )
Return
f_KeyPress( wP ) ; 37 = left, 39 = right, 13 = enter
{
global bLeft := false , global bRight := false , global bEnter := false
If ( wP = 37 )
bLeft := true
If ( wP = 39 )
bRight := true
If ( wP = 13 )
bEnter := true
If ( bLeft || bRight || bEnter )
GoSub , sub_KeyPress
}
sub_KeyPress:
GuiControlGet , sFocus , FocusV
Gui , Submit , NoHide
If ( bLeft && sFocus = "List2" )
{
List2 := ""
GuiControl ,, List2 , |
GuiControl , Focus , List1
}
If (( bRight || bEnter ) && sFocus = "List1" )
{
sList2 := ""
Loop , % nCt
If !( aData[ List1 , A_Index ] = "")
sList2 .= "|" . aData[ List1 , A_Index ]
GuiControl ,, List2 , %sList2%
GuiControl , Focus , List2
GuiControl , Choose , List2 , 1
}
If ( bEnter && sFocus = "List2" )
MsgBox , List1: %List1%`nList2: %List2%
Return
Submit1:
If (( bLeft || bRight ) && List1 )
{
bLeft := false , bRight := false
GuiControl , Choose , List1 , %List1%
}
Return
Submit2:
If (( bLeft || bRight ) && List2 )
{
bLeft := false , bRight := false
GuiControl , Choose , List2 , %List2%
}
Return
Это оказалось намного дольше, чем я ожидал (возможно, есть лучший способ ??), но это работает.Дайте мне знать, если у вас возникли проблемы с соблюдением кода, и я отредактирую и добавлю несколько комментариев для объяснения.
Старый код, показанный здесь для справки и / или сравнения:
FileRead , sCSVRaw , %A_Desktop%/AHK list.csv
Loop , Parse , sCSVRaw , `n
{
If A_Index = 1
{
sHeader := RegExReplace( A_LoopField , ",|`r" , "|" )
Continue
}
sDataDump .= A_LoopField
}
sDataDump := StrReplace( sDataDump , "`r" , "," )
Gui , +AlwaysOnTop
Gui , Add , ListBox , x20 y20 w180 r10 Choose1 vList1 gSubmit1 , %sHeader%
Gui , Add , ListBox , x+40 w200 r10 vList2 AltSubmit gSubmit2 ,
Gui , Show , x800 y150 w500 h200 , Helper HS
OnMessage( 0x100 , "f_KeyPress" )
Return
f_KeyPress( wP ) ; 37 = left, 39 = right, 13 = enter
{
global bLeft := false , global bRight := false , global bEnter := false
If ( wP = 37 )
bLeft := true
If ( wP = 39 )
bRight := true
If ( wP = 13 )
bEnter := true
If ( bLeft || bRight || bEnter )
GoSub , sub_KeyPress
}
sub_KeyPress:
GuiControlGet , sFocus , FocusV
Gui , Submit , NoHide
If ( bLeft && sFocus = "List2" )
{
List2 := ""
GuiControl ,, List2 , |
GuiControl , Focus , List1
}
If (( bRight || bEnter ) && sFocus = "List1" )
{
sList2 := ""
Loop , Parse , sDataDump , `,
If InStr( A_LoopField , Trim( List1 ))
sList2 .= "|" . A_loopField
GuiControl ,, List2 , %sList2%
GuiControl , Focus , List2
GuiControl , Choose , List2 , 1
}
If ( bEnter && sFocus = "List2" )
{
Loop , Parse , sHeader , "|"
If ( A_LoopField = List1 )
nList1Output := A_Index
nList2Output := List2
MsgBox , List1: %nList1Output%`nList2: %nList2Output%
}
Return
Submit1:
If (( bLeft || bRight ) && List1 )
{
bLeft := false , bRight := false
GuiControl , ChooseString , List1 , %List1%
}
Return
Submit2:
If (( bLeft || bRight ) && List2 )
{
bLeft := false , bRight := false
GuiControl , Choose , List2 , %List2%
}
Return