Apple の脅威の通知と金銭目当てのスパイウェアへの対策について

AppleScriptのtell文についての質問です

目的:ユーザ辞書登録の自動化の為に、AppleScriptを作成中です。登録対象単語を選択してからスクリプトを実行すると、ユーザ辞書登録の追加画面に対象単語をペーストするような仕様を想定しております。

課題:ユーザ辞書登録画面を立ち上げてペーストするところまでは実現できましたが、最初の「選択されている登録対象単語をコピーするステップ」で躓いています。

tell application "アプリ名"

key code 8 using command down

delay 1

end tell

ユーザ辞書登録が必要になるのは、任意のアプリケーション上ですので、上記の"アプリ名"をどのように記述したらよいのか?悩んでおります。おそらく、アクティブ画面等の指定ができるといいように思うのですが、その記述方法が検索できませんでした。

MacBook Pro (M3 Pro, 2023)

投稿日 2024/05/04 01:14

返信
返信: 12

2024/05/04 22:13 vz.r への返信

確認作業ありがとうございます。


まず、Firefox について。vz.r さんの変更版は当方でも動きました。もし Sonoma でも動くようなら下図のように AppleScript の前に「入力からテキストを取得」を置くのもありかと。



ーーーーー


次に、最後の入力のところは、こんな感じでどうでしょうか。Ventura はこれでいけます。


変更前

                tell sheet 1 of sheet 1
                    set value of text field 2 of group 1 of scroll area 1 of group 1 to aPhrase
                end tell


変更後

                tell sheet 1 of sheet 1
                    tell group 1's scroll area 1's group 1
                        set focused of text field 2 to true
                        set value of text field 2 to aPhrase
                    end tell
                end tell


# 文章を若干変更しました。

2024/05/04 22:40 Hiro__S への返信

ありがとうございます。

「入力からテキストを取得」「入力のところのAppleScript」 Sonomaでも動作しました。

その方法の方がスマートですね。


tell sheet 1 of sheet 1
	--set value of text field 2 of group 1 of scroll area 1 of group 1 to aPhrase
	tell group 1's scroll area 1's group 1
		set focused of text field 2 to true
		set value of text field 2 to aPhrase
		delay 0.4 --フォーカス移動の動作を遅延させるため記述。
		set focused of text field 1 to true
	end tell
end tell


Hiro__Sさんご提示のスクリプトに、フォーカスをtext field 1に戻す一文を追加しました。

ご提示のもので完成度が上がりましたね!ありがとうございました。


2024/05/04 18:51 vz.r への返信

横から失礼します。


このワークフローは当方の環境ではうまく動かないので二点確認をお願いします。


まず一点目。Firefox 上でテキストを選択した際に期待どおりの結果が得られるかを確認して欲しいです。当方ではテキストエディットなどは問題ありませんが Firefox で上手くいきません。


二点目。最後に表示されるシートで「入力/読み」を入力すると「追加」ボタンが有効になるかを確認して欲しいです。当方では「入力/読み」を入力しても「追加ボタン」が有効になりません。


Sonoma で問題ないならこのままでも良いと思いますが、Ventura でも、、、ということなら若干変更しなければならないかなと。問題の回避策は既に見つけたので必要なら後ほどポストします。


当方の環境

  • Ventura 13.6.6 (Parallels Desktop 18)
  • Firefox 125.0.3


2024/05/04 03:53 Kodack03 への返信

最前面のアプリなら指定や取得ができますが、スクリプトエディタ上で実行すると自身を取得してしまうので、スクリプトの実行方法が限られます。

Automatorやショートカットアプリで選択したテキストを右クリックのメニューからスクリプトに送る“サービス”を作成するのがいいかもしれません。

現状、どのような実行方法をお考えでしょう?



2024/05/04 15:35 Kodack03 への返信

サービスについて回答を作成しますので、少しお待ちください。

それから、先ほどのスクリプトを構文確認をパスし動作させられる状態にするには、下記のように記述します。

スクリプトエディタ上にコピペし、語句を選択状態で実行すると、選択したところがコピーされます。


追記

キーイベントを動作させるには、「System Events」を呼び出す必要があります。

また、その機能を使うには、システム設定のアクセシビリティで許可が必要です。

もう許可されているなら大丈夫です。


-- 最前面のアプリケーション名を取得(appName)
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set frontApp to POSIX path of (path to frontmost application)
set appName to ((current application's NSString's stringWithString:frontApp)'s lastPathComponent()'s stringByDeletingPathExtension) as string
--display dialog appName

-- コマンドキーを押しながらc(コピー)
tell application "System Events"
	tell process appName
		key code 8 using command down
		--keystroke "c" using {command down}
		delay 1
	end tell
end tell


2024/05/04 16:07 Kodack03 への返信

お待たせしております。

“ショートカット”アプリでの作成になりますが、下記のようにアクションを組んで実行させれば..



スクリプト:

on run {input, parameters}
	tell application "System Settings"
		checkSheet() of me
		reveal anchor "TextReplacements" of pane id "com.apple.Keyboard-Settings.extension"
		activate
		inputText((input's item 1) as string) of me
	end tell
	
	return input
end run

on checkSheet()
	activate application "System Settings"
	tell application "System Events"
		tell process "システム設定"
			repeat
				if exists (every sheet of window 1) then
					set frontmost to true
					key code 53
					delay 0.3
				else
					exit repeat
				end if
			end repeat
		end tell
	end tell
	delay 0.3
end checkSheet

on inputText(aPhrase)
	activate application "System Settings"
	tell application "System Events"
		tell process "システム設定"
			-- insert GUI Scripting statements here:
			repeat until (exists sheet 1 of window 1)
				--delay 0.4
			end repeat
			tell window 1
				tell sheet 1
					click button 1 of group 1 of scroll area 1 of group 1
				end tell
				repeat until (exists sheet 1 of sheet 1)
					--delay 0.4
				end repeat
				delay 0.3
				tell sheet 1 of sheet 1
					set value of text field 2 of group 1 of scroll area 1 of group 1 to aPhrase
				end tell
			end tell
		end tell
	end tell
end inputText


スクリプト文は一例です。

ご自身で組んだものを内包しても大丈夫ですよ。


https://youtu.be/Lv6xc-wdd40


完璧な回答は難しいので、わからないところあればその都度おっしゃってください。

わかる範囲内ならお答えできます。


追伸 動作させるアプリをアクセシビリティで許可する必要があると思います。

2024/05/04 20:47 Hiro__S への返信

一点目:

Firefox 125.0.3 で確認してみました。

私の環境でもそのままではうまく行かず、対策としてショートカットのアクションを追加してみました。

これでどうでしょう?


use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

on run
	set frontApp to POSIX path of (path to frontmost application)
	set appName to ((current application's NSString's stringWithString:frontApp)'s lastPathComponent()'s stringByDeletingPathExtension) as string
	
	if appName = "Firefox" then
		return true
	else
		return {}
	end if
end run

二点目:

>最後に表示されるシートで「入力/読み」を入力すると「追加」ボタンが有効になるかを確認して欲しいです。当方では「入力/読み」を入力しても「追加ボタン」が有効になりません。


すみません。そこまでは確認してなかったです。

そのままでは有効にならず、変換/語句に何かテキストを入力操作して入力したいらないものを削除 としないといけないようです?


>問題の回避策は既に見つけた

是非教えてください。

2024/05/05 00:23 vz.r への返信

皆さま

いろいろ、ご教示くださいまして、どうもありがとうございました。

お陰様で、想定していた機能(ユーザ辞書登録のショートカットキー化)を実現できました。

当方、macユーザになって4ヶ月、分からないことばかりです。

今回は、とても勉強になりました。

ご提示いただいたAppleScriptは未だ消化できていないので、これからStudyしていきたいと思います。

2024/05/04 06:45 Kodack03 への返信

最前面のアプリケーション名を取得できたらいいっていうのなら、こんな感じで取得整形できます。


use AppleScript version "2.4"
use scripting additions
use framework "Foundation"

set frontApp to POSIX path of (path to frontmost application)
set appName to ((current application's NSString's stringWithString:frontApp)'s lastPathComponent()'s stringByDeletingPathExtension) as string

display dialog appName

2024/05/04 09:37 vz.r への返信

現在、上記のコメントを参考にして、次のようなAppleScriptを作成してみましたが、エラー(構文エラー)が出ます。


-- 最前面のアプリケーション名を取得(appName)

use AppleScript version "2.4"

use scripting additions

use framework "Foundation"


set frontApp to POSIX path of (path to frontmost application)

set appName to ((current application's NSString's stringWithString:frontApp)'s lastPathComponent()'s stringByDeletingPathExtension) as string

display dialog appName


-- コマンドキーを押しながらc(コピー)

tell application "appName"

key code 8 using command down

delay 1

end tell


課題1:構文エラー

エラー内容:end of lineがあるべきところですが、identifierが見つかりました。

対象:"code"


課題2:

また、構文エラーするスクリプトをコメント化して実行してみると、「Automator」ダイアローグが出ました。

これは、最初のコメントにあった「スクリプトエディタ上で実行すると自身を取得してしまう」ということだと思います。


依頼:

以上のように煮詰まっております。

可能であれば、最初のコメントのスクショのような「対象単語を選択して、右クリックで"ユーザ辞書に登録"」

の実現方法をご教示願えませんか。



2024/05/04 09:15 vz.r への返信

回答ありがとうございます。

私が実現したいのは、正にご提示のような右クリックでユーザ辞書登録することです。

それをAutomatorのクイックアクションでできるのではないか?と考えて奮闘しておりますが、如何せん初心者なので、基本的なこともわかっておりません。(次の回答の返信に続く)

AppleScriptのtell文についての質問です

Apple サポートコミュニティへようこそ
Apple ユーザ同士でお使いの製品について助け合うフォーラムです。Apple ID を使ってご参加ください。