キーボードのレイアウトの変更を自動化する（AppleScript）

 # はじめに

私は、MACにおいて、 入力ソースの「日本語 - ローマ字入力」の「英字のレイアウト」を「Dvorak」「ABC」「Dvorak - 左手用」の切り替えを頻回にする。手動だと面倒なので、AppleScriptのGUIスクリプティングでこの作業を自動化した。

# 環境
CUP: 1.6 GHz デュアルコアIntel Core i5
OS: macOS Sonoma (14.7.6)
スクリプトエディタ: 2.11
AppleScritp: 2.8

# コード

```AppleScript
tell application "System Settings"
	activate
end tell

delay 1

tell application "System Events"
	tell process "System Settings"
		-- メニューから「キーボード」を開く
		click menu item "キーボード" of menu "表示" of menu bar item "表示" of menu bar 1
		
		-- 「キーボード」ウィンドウが出るのを最大10秒待つ
		set timeoutSeconds to 10
		set elapsedSeconds to 0
		repeat until exists window "キーボード"
			delay 0.5
			set elapsedSeconds to elapsedSeconds + 0.5
			if elapsedSeconds ≥ timeoutSeconds then
				display dialog "ウィンドウ「キーボード」が見つかりませんでした。" buttons {"OK"} default button "OK"
				return
			end if
		end repeat
		
		tell window "キーボード"
			
			-- 編集ボタンが出現するまで最大10秒待つ
			set timeoutSeconds to 10
			set elapsedSeconds to 0
			repeat until exists button 1 of group 3 of scroll area 1 of group 1 of group 2 of splitter group 1 of group 1 of window "キーボード" of application process "System Settings" of application "System Events"
				delay 0.5
				set elapsedSeconds to elapsedSeconds + 0.5
				if elapsedSeconds ≥ timeoutSeconds then
					display dialog "「編集」ボタンが見つかりませんでした。" buttons {"OK"} default button "OK"
					return
				end if
			end repeat
			
			click button 1 of group 3 of scroll area 1 of group 1 of group 2 of splitter group 1 of group 1 of window "キーボード" of application process "System Settings" of application "System Events"
			
			-- サイドバ―が「すべての入力ソ―ス」がアクティブになっていることを確認
			repeat until exists static text "メニューバーに入力メニューを表示" of group 1 of scroll area 1 of group 2 of splitter group 1 of group 1 of sheet 1 of window "キーボード" of application process "System Settings" of application "System Events"
				delay 0.5
				set elapsedSeconds to elapsedSeconds + 0.5
				if elapsedSeconds ≥ timeoutSeconds then
					display dialog "システム設定も閉じてスクリプトを再起動してください" buttons {"OK"} default button "OK"
					return
				end if
			end repeat
			
			-- 入力ソ―スを「あ　日本語 - ロ―マ字入力」にする
			tell application "System Events"
				key code 125
			end tell
			
			-- 「英字のレイアウト」のpop up buttonを押下する
			repeat until exists pop up button 5 of scroll area 1 of group 2 of splitter group 1 of group 1 of sheet 1 of window "キーボード" of application process "System Settings" of application "System Events"
				delay 0.5
				set elapsedSeconds to elapsedSeconds + 0.5
				if elapsedSeconds ≥ timeoutSeconds then
					display dialog "「英字のレイアウト」のpop up buttonが見つかりません" buttons {"OK"} default button "OK"
					return
				end if
			end repeat
			
			click pop up button 5 of scroll area 1 of group 2 of splitter group 1 of group 1 of sheet 1 of window "キーボード" of application process "System Settings" of application "System Events"
			click menu item "Dvorak" of menu 1 of pop up button 5 of scroll area 1 of group 2 of splitter group 1 of group 1 of sheet 1 of window "キーボード" of application process "System Settings" of application "System Events"
		end tell
		
	end tell
end tell
```

# 要点
・以前のアプリ名「システム環境設定」は、「システム設定」になった。

・GUI部品を調べながら一階層ずつすすみ、目的のGUI部品を探し出す。

・GUI部品を調べるのにキーワード「entire contents」を使って、それらしき部品を探り当てる。

・どうしてもGUI部品が見つからない場合は、キーエミュレーションでフォーカスするGUI部品を変える（「日本語 - ローマ字入力にフォーカスわあてる箇所）。

・画面の遷移が遅く、GUI部品が出現するのに時間がかかる場合は、「repeat (ループ)」を用いて待つ。