このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

文字列の取得 by AppleScript

発言者:前薗 健一
( Date Sunday, June 06, 2004 22:27:01 )


Mac OS X の ScriptMenu の AppleScript を書いているのですが、
現在アクティブ (最前面) な任意のアプリケーションのウィンドウ
の文字列が選択 (ハイライト表示) されていたとして、この選択さ
れた文字列を AppleScript で取得することは可能でしょうか?

Apple の AppleScript のドキュメント、手持ちの書籍で一通り
調べたつもりなのですが、解決策が見つけられずにいます。

木本豪 さんからのコメント
( Monday, June 07, 2004 18:21:16 )

ScriptMenu からだと難しそうです.
最近フリーウェアになってしまった Script Palette で下記のスクリプトが動きました.
実行前に環境設定で「ユニバーサルアクセス」の
「補助装置にアクセスできるようにする」を有効にする必要があります.

tell application "System Events"
  keystroke "c" with command down
  set wotax to the clipboard
  try
    set wotax to wotax as real
    set wtax to round (wotax * 1.05)
    set the clipboard to wtax as string
    keystroke "v" with command down
  end try
end tell


→  Script Palette

栗田哲郎 さんからのコメント
( Monday, June 07, 2004 20:44:10 )

以下のようにすれば Script Menu でも可能です。

set frontmostApp to path to frontmost application
tell application "Finder"
  set appName to displayed name of frontmostApp
end tell

activate application appName
tell application "System Events"
  tell application process appName
    keystroke "c" using command down
  end tell
end tell

tell application appName
  set theText to the clipboard as string
end tell

前薗 健一 さんからのコメント
( Monday, June 07, 2004 23:06:22 )

ありがとうございます。

アプリケーションによっては

activate application appName

で、「ユーザの操作は許可されていません」というエラーが起こるものがありました。
それから、クリップボード経由でなく、直接データを取得するということはできないも
のでしょうか?

栗田哲郎 さんからのコメント
( Tuesday, June 08, 2004 16:15:07 )

どんなアプリケーションでうまくいかないのでしょうか?
後学のためご指摘いただければ幸いです。

あと、任意のアプリケーションからクリップボードを経由しないでデータの取得というのは難しいと思います。アプリケーションが特定できて、そのアプリケーションがscriptableであれば可能でしょう。

前薗 健一 さんからのコメント
( Tuesday, June 08, 2004 17:53:45 )

> どんなアプリケーションでうまくいかないのでしょうか?

全ての手持ちのアプリケーションを試したわけではありませんが

OK
Finder, Safari, Jedit4, Eudora

NG
アドレスブック, スティッキーズ, スクリプトエディタ

と、ここで気がついたのですが、うまくいかないのは日本語名のアプリケーションですね。
で、試しに

if appName is equal to "アドレスブック" then
  set appName to "Address Book"
end if
activate application appName

としてみたら、うまくいきました。

activate application appName

は、日本語に対応していないようですね。

> 任意のアプリケーションからクリップボードを経由しないで ...  [略]

具体的にはアドレスブックの電話番号を選択しておいて、その電話番号が
携帯電話 ( 090 で始まる ) であれば 0039 ( NTT 西 ) を頭に付加して
MacDialer というアプリケーションに AppleEvent を送って電話をさせる
ということをやりたいのですが、アドレスブックだけではなく汎用的な
ものができないものかな?と思って試行錯誤しているところです。

栗田哲郎 さんからのコメント
( Tuesday, June 08, 2004 18:35:04 )

では、以下のようにすれば、任意のアプリケーションでデータが取得できると思います。
但し、クリップボード経由ですが。

set frontmostApp to path to frontmost application
tell application "Finder"
  set appName to name of frontmostApp
end tell

if appName ends with ".app" then
  set appName to text 1 thru -5 of appName
end if

activate application appName
tell application "System Events"
  tell application process appName
    keystroke "c" using command down
  end tell
end tell

tell application appName
  set theText to the clipboard as string
end tell

前薗 健一 さんからのコメント
( Tuesday, June 08, 2004 19:56:02 )

ありがとうございます。

>if appName ends with ".app" then
>  set appName to text 1 thru -5 of appName
>end if

でも、だめでした。
要は appName が英語か日本語かの問題だと思うのですが。

栗田哲郎 さんからのコメント
( Wednesday, June 09, 2004 12:34:01 )

最初に提示したスクリプトの
tell application "Finder"
  set appName to displayed name of frontmostApp
end tell

の部分を

tell application "Finder"
  set appName to name of frontmostApp
end tell

に変更されましたか?

前薗 健一 さんからのコメント
( Wednesday, June 09, 2004 14:39:04 )

失礼しました。変更していませんでした。変更したらうまくいきました。

ただ

keystroke "c" using command down
set theText to the clipboard as string

ではタイミングによってはクリップボードに反映されないので、

keystroke "c" using command down
wait(...) --subroutine
set theText to the clipboard as string

と、調整しています。