AppleScript アップルスクリプト 質問、発表 7 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>669
すごいスクリプトお疲れ様です。
初歩的なこともわかってないのですが、
これはどのように使えば動くんでしょうか。 形は一応AppleScriptだからスクリプトエディタにコピペで動くよ(10.15と10.12で試した)
ただ、実質swiftだからXcodeのコマンドラインツール入れてないなら試さない方がいいと思うよ >>671
教えていだだいてありがとう。
Xcodeはインストールしてないので試さないほうがいいですね。
先日Karabiner Elementsで問題は解決したと上でかいたけど、
スリープが出来ない大問題が発覚してやはりAppleScriptに頼っていますので
音量調整で画面にスピーカーマークが出るようにできないかと情報を集めているので
上のスクリプトは藁をも掴む思いでした。 まあ普通に AppleScriptObjC や JXA で書き直せるわな
元はどうもPythonのをみたいだが、何でSwiftでなんだかというのはある
単なる趣味だろうけど どこまでできるか試したかったってとこは趣味だが、JXAに書き直しても動かなかったからswiftのままなのはしぶしぶだ
10.15だとスクリプトエディタがクラッシュしちゃうんだもん
普通のキーボードイベントで試すと10.12では動くのに、やっぱ10.15だとクラッシュするし AppleScriptで、システム環境設定のモニターのカラープロファイルを任意のものに変更ってできないのでしょうか?
出来るなら教えていただけませんか。 「変更」はAppleScriptではモロにはサポートしてないよう
GUI Scripting か Cocoa API 使ってで可能だろう
Cocoa API を使ってのは Python で書いてるのがあるからそれを使えば
customdisplayprofiles set /path/to/profile.icc
customdisplayprofiles set --display 2 /path/to/profile.icc
と簡単にできそう 誰か教えていただけませんか。
tell application "Firefox"
activate
tell front window
set bounds to {200, 200, 1000, 1000}
end tell
end tell
これでアプリが起動してウインドウが開いてくれますが、
すでにアプリが起動している場合新規ウインドウを作ってくれません。
その場合DockのFirefoxのアイコンをクリックするとその時にやっと新規ウインドウをつくってくれます。
そうではなく、アプリの起動終了時に関係なく新規ウインドウを作ってくれるようにはできないでしょうか。 アプリただ起動時Dockからアクティベートされた時に新規なのは、
AppleScript関係ない、普通のアプリケーションの挙動
AppleScriptでそうでなくならそう書くそう書けばいいだけ 新規Windowを開く命令を書かないと。
その前に、Windowが開かれているかどうかの確認もしてね。 >>679
Dockクリック相当の切り替え命令がないんだよね(俺が知らないだけかもしれんが)
とりあえずこんなんが手軽かな
do shell script "open -a Firefox"
tell application "Firefox"
tell front window
set bounds to {200, 200, 1000, 1000}
end tell
end tell >>683
なるほど。こう書けばいいんですね。
とても参考になります。
Safariだと上ので問題なく開いてたので訳が分からなくて。
レスをいただいた方ありがとうございました。
もっと勉強します。 if (count of document) is 0 then make new document 的な話じゃなくて? >>683
Dockが賢いことして、クリックした時に(アプリケーションをアクティブにするとか関係なく)対象のアプリケーションでドキュメントウィンドウが無いなら New Document AppleEvent を対象アプリケーションに送ってるという例外/Dockというアプリの挙動
アプリケーション起動時に何も無い(プリントもドキュメントを開くも)場合は、New Document AppleEvent を送るというのはOSの仕様
アプリケーション(アクティベート)スイッチでNew Documentを送るというのはOSの仕様にはない
>>679のそのままなら
set needsMakeNewDocument to application id "org.mozilla.firefox" is running
tell application "Firefox"
activate
if needsMakeNewDocument then
tell application "System Events" to keystroke "n" using command down
end if
...
end tell
な感じかなあ。本当は make new document を使いとこだが、document オブジェクトは作れるが、それをどうこう(Windowに結びつける)とかできないのねFireFoxは。ユーザ操作をシミュレート的なのはブツが作られるのに遅延があるから待つかちゃんとチェックが必要になる
open とか アプリケーション実行ファイル直接叩いた方が簡単とかあるよねえ 追加でレスをいただきまして感謝します。
こちらもメモをさせていただき参考にさせていただきます。
ありがとうございます。 do shell script "open -a Firefox http://about:newtab"
でいけんじゃないの
ちょっと試したところでは Dockが送っているのはreopen命令じゃないのかな。
つまり、
tell app “Firefox” to reopen
で、ウインドウがない場合は新規に開くのでは? reopen知らんかったわ
まさにこれだしハンドラも書けんのね 選択したテキストをスティッキーズに貼り付けてフロートってのをやりたくてAutomatorで作ったんだけど、たまにエラーが出る
delay入れた方がいいのかな
ていうかスティッキーズってスクリプタブルじゃないのね…
on run {input, parameters}
set the clipboard to (input as string)
tell application "Stickies" to activate
tell application "System Events"
tell process "Stickies"
tell window 1
keystroke "n" using command down
keystroke "v" using command down
key down {command, option}
keystroke "f"
key up {command, option}
end tell
end tell
end tell
end run 入れた方がいいんじゃない
それと tell window 1 ているの? キーストロークは安定しないからな…delay入れないとまず失敗する >>693
なんとなく入れたけど要らないかも
delay気持ち悪いから入れたく無かったんだけど、やっぱ入れた方がいいのね。ありがとう
>>694
やっぱりそうかー
ウインドウフロートできるスクリプタブルなアプリ無いかなあ… delay気持ち悪いのわかるわー
昔の遅いマシンだと全く問題なかったやつが、早いマシンに買い換えたらイラレのドキュメント開く→保存して閉じるに間に合わなくて、スクリプトの書類に対してショートカットキー連発しちゃったりしたからkeystroke ひとつひとつにdelay かける羽目になったことある サービスに「スティッキーメモを作成」ってのがあるけど >>696
keystrokeとか同期しない、アプリ側での実行の遅延が発生するのはしょうがないな
ちゃんと対象が準備できてるかチェックする待つのがより正しいんだけどな
だけど、最低でも三行かかるし、delayはお手軽にとりあえずいいやなら十分有用
確実性(無駄な待ちを排除するのを含めて)を求めるから、ちゃんとチェックするけど delayはもう諦めちゃってるわ
自分の環境で動けばいいやと
あとは、メニューバーを直接操作するとdelay不要な場合もある
tell first menu bar's menu bar item "編集"'s menu "編集"'s menu item "ペースト" to click >>692 でなら、どこでエラってるのかはわからんけど、
1) Stickies が(メニューショートカット)キーを受け入れる状態になってない=frontmostにまだなってない
2) 新しいノートウィンドウがまだできてない
の2つかな、ありそうなのは
keystrokeは単に(システム)イベントキューに突っ込むだけ、その後はシステムがfrontmostアプリにイベント振り分けるから基本的に取りこぼしはない
アリそうなのはアプリの準備(ウィンドウの作成とか)がまだとかだが、Command+Nからウィンドウ作ってそのウィンドウの準備が終わるまでが一連の続き仕事にするのは基本的なアプリの形態だから、次のCommand+V(およびCommand+Option+F)は当然その新しいウィンドウに対してのになるはずだと思うけど、Stickiesのような基本的なアプリ形態だろなアプリは
とりあえず、
tell application "Stickies" to activate
tell application "System Events" to tell process "Stickies"
repeat while not frontmost
delay 0.1
end repeat
keystroke "nv" using command down
keystroke "f" using {command down, option down}
end tell
でいいんじゃないのかなあ(うちではfrontmostがfalseにもならないのでどうかだが) スレチだとは思いつつも書き込みます
DragThingって神ランチャーでしたね
ささっとスクリプト書いて、パッと走らせる、案件ごとにドックを切り替えて上から順番に立ち上げる…
アプリケーションに保存してDOCKから走らせたりしてるんですが、なんかのタイミングで突然「許可されていません」とかごちゃごちゃ言い始めたりしてスクリプト走らせたまま離席して時間無駄にした事がたまーに起こる
スクリプトメニューに登録して解決!だったんだけど、スクリプト使うたび画面右上までカーソール持ってくのが遠い…
案件で分けたら一体どれだけの数のスクリプトがあるのやらって感じでメニューが膨大な量になる
これもう自分好みのランチャー作るためにプログラミング勉強するしかないのか🤪
高卒ジジイには今から勉強するのしんどいよ なんか書いて欲しいならそう言っちゃったほうがいいような ごめん、愚痴です
ついでに聞くならスクリプト大量に回してる人はどんな風に管理してらっしゃるのでしょう いやいや、謝るようはことは何もなく…
スクリプトたくさんある人はターミナル使ってると思うので
パスが通ったとこに置いてるだけとか、そんなんじゃないかなって
GUIから起動したいときは、自分ならドックに登録しちゃうかな DragThingの勝手はわからないけど、他の試せばいいじゃん
Keyboard MaestroとかAlfredとかHotKeyとか
HotKeyは無料、App Storeにある Dragthingは直感的でほんと使いやすかったから仕方ない
キーボードに手を伸ばさずマウスポチだけで済むワークフロー組めたし Dragthing懐かしい
旧MacOSでなんちゃってdockとかやってたなー >>701
>なんかのタイミングで突然「許可されていません」とか
何かのタイミング は スクリプトに手を加えて保存し最初の起動
許可されていません は アクセス許可を求められる
では?
on run
-- hello
tell application "Finder" to selection
end run
コメントの部分を変えて保存するだけでも直後の最初の起動でFinderへのアクセスの許可を求められる
だったら、バンドル内容を表示 でにある 識別子 をちゃんと設定したら解決する
hogehoge.com とかドメイン持ってるなら com.hogehoge.アプリ名 (アプリ名でなくてもいいけど、そのアプリと識別できるユニークであれば)
ドメイン持ってないなら、local.アプリ名 とか com.example.アプリ名 とかでも問題はまあ無いだろう。バンドル識別子 として そんなの勝手に使う(定義する)のはそのMacを使ってる本人ぐらいだろから
別の要因や許可されていませんという拒否でも効きそうかな >>708
>だったら、バンドル内容を表示 でにある 識別子 をちゃんと設定したら解決する
以下は無かったことに
これじゃないこれだけじゃない何だったかなあ メールのルールで、受信したメール本文をcsvに書き出す処理を行いたいのですが、
同じタイミングで複数のメールを受信した時に、処理が1つのメールに対してしか
行われません(A、B、Cのメールを同時に受信した場合、Cに3回処理が行われる)。
以下がソースですが、解決法はあるでしょうか?
using terms from application "Mail"
on perform mail action with messages messageItem for rule csvRule
tell application "Mail"
repeat with messageArr in messageItem
set contentStr to content of messageArr as string
set csvStr to do shell script "echo " & quoted form of contentStr & " perl -pe s/\\n/,/"
do shell script "echo " & quoted form of csvStr & " >> ~/csv.csv"
end repeat
end tell
end perform mail action with messages
end using terms from IMAP?
POPはググったらあるようにすんなりまともに動くことは無さげ
スクリプトの起動が早すぎ=メールの準備(オブジェクト)が出来上がってない状態で入ってくる感じ
せいぜいトリガー程度で、特別なグループ(メールボックス)に移動させて少し間を置いた後でそのメールボックス内の全てを処理するように別建てかなあ >>711
IMAPです。
助言していただいたことを参考に、処理済みのメールボックスを用意し、受信をトリガーとして
inboxのlast messageに対してcsv書き出しの処理を実行。その後、処理済みボックスへ移動、
というのをinboxが空になるまでrepeatすることで解決しました。
ありがとうございました。 Monterey で menubar item 中の window が取れなくなった
tell application "System Events"
tell application process "ControlCenter"
tell menu bar 1
tell menu bar item "Sound"
every UI element
end tell
end tell
end tell
end tell
としても、以前のように output のリストが出なくて {} になる
どう変わったかわかるひといる? まだBigSurだけどwindowってクリックして表示させないと取れなくない?
あとwindowはmenu bar itemじゃなくてprocessが持ってるんじゃないの
tell application "System Events"
tell application process "ControlCenter"
tell menu bar 1's (first menu bar item that name is "サウンド") to click
tell window 1's group 1's scroll area 1's checkbox "外部ヘッドフォン" to click
end tell
end tell 3行目はこれで良かったか
tell menu bar 1's menu bar item "サウンド" to click >>714
ありがとう、そして雑な例ですまん
書いてくれたものとほぼ同じ
tell application "System Events"
tell application process "ControlCenter"
set btMenu to menu bar item "Sound" of menu bar 1
tell btMenu to click
set btCheckbox to checkbox 1 of scroll area 1 of group 1 of window "Control Center" whose title contains hogehoge
set btCheckboxValue to value of btCheckbox
tell btCheckbox to click
tell btMenu to click
end tell
end tell
ということが BigSur までできていたんだが、今はできなくなった、ということ。 >>714
ありがとう、そして雑な例ですまん
書いてくれたものとほぼ同じ
tell application "System Events"
tell application process "ControlCenter"
set btMenu to menu bar item "Sound" of menu bar 1
tell btMenu to click
set btCheckbox to checkbox 1 of scroll area 1 of group 1 of window "Control Center" whose title contains hogehoge
set btCheckboxValue to value of btCheckbox
tell btCheckbox to click
tell btMenu to click
end tell
end tell
ということが BigSur までできていたんだが、今はできなくなった、ということ。 スクリプトエディタで実行するとエラーメッセージでどこが取れてないか分かるんじゃない
OSバージョン変わるとUI elementの階層とかpropertyが変わってたりすることは良くある ズバリ教えてほしいです。
流れはこんな感じ
VLCが起動していて、再生中の場合はVLCを一時停止して(停止ではない) (1)を実行
VLCが起動していて、停止中の場合 (1)を実行
VLCが起動していない場合 (1)を実行
この3つを条件にしたApple Scriptがほしいです。
再生・一時停止は、以下の実行するたびに切り替わります
tell application "VLC"
play
end tell
(1)は以下を使用します
do shell script "pmset displaysleepnow"
どなたか教えていただけませんか。
よろしくお願いします。 if application "VLC" is running then
-- 起動している
tell application "VLC"
if playing then
-- 再生中
else
-- 再生中でない
end if
end tell
else
-- 起動していない
end if
とか こう?
if application "VLC" is running then
tell application "VLC" to play
end if
do shell script "pmset displaysleepnow" みなさん早速ありがとうございます。
>>722
教えていただいたものを実行してみましたが、
再生中の場合は、一時停止してスリープへ移行したのですが、
一時停止中の場合は、再生が開始された状態でスリープへ移行してしまいました。
>>720
教えていただいたものでうまくきそうです。
-- 再生中のところにだけに
tell application "VLC"
play
end tell
でいけそうです。
早々に皆さんにレスをいただきとても感謝です。
ありがとうざいます。 >>723です。
昨日はみなさん貴重なレスをありがとうございました。
教えていただいたものでうまくいっています。
しかし一部に修正したい箇所が出てきました。
現在は
if application "VLC" is running then
-- 起動している
tell application "VLC"
if playing then
-- 再生中
play
else
-- 起動してるが再生中ではない
end if
end tell
else
-- 起動していない
end if
do shell script "pmset displaysleepnow"
を使っていますが、これだとVLCが起動していない時にスクリプトを実行するとVLCが起動していまいます。
たぶんtell application "VLC”のところで起動しているんだと思うのですが、
起動していない時には起動しないようには出来ないですかね。
厚かましいく大変申し訳ないですがどなたかわからないでしょうか。 >>724
解決できたようです。
これまでAutomatorにAppleScriptをアプリケーションにして使っていましたが、
これをクイックアクションに変更して検索対象をVLC.appにすると問題は解決しました。
たくさんスレを消費して申し訳ありませんでした。
教えていただいた方々改めてありがとうございました。 何度もすみません。
問題が解決したと思ったのは私の早とちりでした。 さっき俺が書こうとしてたトンデモ案
if application "VLC" is running then
-- 起動している
do shell script "echo '
tell application ¥"VLC¥"
if playing then
-- 再生中
play
else
-- 起動してるが再生中ではない
end if
end tell' | osascript"
else
-- 起動していない
end if しまった
さっきはSafariで書こうとしてたのにうっかりしてバックスラッシュを化かしてしまった >>727
なんとレスをいただけるとは思わなかったので嬉しいです。
Autometorでアプリケーションで組み込んでみましたが今のところ思った通りにうごいているようです。
もう少し確認してみますが、早速レスをいただきとても感謝します。
ありがとうございます。 >>728
バックスラッシュは大丈夫です。
お気遣いありがとうございます。 Webページのボタン(など)を押す
on getElementCenter for xpaths by pickerfunc
tell application "Google Chrome" to return execute active tab of front window javascript "
(function (xpaths, pickerfunc) {
const getElementsByXPath = (xpath) => {
const result = []
const xpathResult = document.evaluate(xpath, document)
var item; while((item = xpathResult.iterateNext()) != null)
result.push(item)
return result
}
var elm = null;
for(const xpath of xpaths){
if((elm = getElementsByXPath(xpath).find(pickerfunc)) != null)
break
}
if(elm == null)
return ' '
const rect = elm.getBoundingClientRect()
const zoomRatio = (false)? window.devicePixelRatio : (window.outerWidth / window.innerWidth);
return {x:((rect.left + rect.width / 2) * zoomRatio), y:((rect.top + rect.height / 2) * zoomRatio)}
})(" & xpaths & "," & pickerfunc & ")"
end getElementCenter on clickElement for xpaths by pickerfunc
repeat 10 times
set elementCenter to getElementCenter for xpaths by pickerfunc
if class of elementCenter is record then exit repeat
delay 0.1
end repeat
if class of elementCenter is not record then error "Can't get element"
set webAreaPosition to missing value
tell application "System Events" to tell process "Google Chrome"
repeat 10 times
try
set webAreaPosition to position of first item of (UI elements of first group of front window whose role is "AXWebArea")
exit repeat
end try
delay 0.1
end repeat
if webAreaPosition is missing value then error "AXWebArea missing"
click at {((first item of webAreaPosition) + (x of elementCenter)), ((second item of webAreaPosition) + (y of elementCenter))}
end tell
end clickElement Safariでは4箇所変更
2c2
< tell application "Safari" to return do JavaScript "
---
> tell application "Google Chrome" to return execute active tab of front window javascript "
22c22
< })(" & xpaths & "," & pickerfunc & ")" in current tab of front window
---
> })(" & xpaths & "," & pickerfunc & ")"
34c34
< tell application "System Events" to tell process "Safari"
---
> tell application "System Events" to tell process "Google Chrome"
37c37
< set webAreaPosition to position of first item of (UI elements of first scroll area of first group of first group of first tab group of first splitter group of front window whose role is "AXWebArea")
---
> set webAreaPosition to position of first item of (UI elements of first group of front window whose role is "AXWebArea")
「全部」を押す
clickElement for "[ '//a[@class=\"menuitem\"]' ]" by "e => true"
「最新50」を押す
clickElement for "[ '//a[@class=\"menuitem\"]' ]" by "(e, i) => i == 2"
AXWebAreaが現れないのがある。System Event's UI elements中にに存在しない。有るのに)。ウィンドウを前後なぞしたりしたら急に現れるナゾ
でも、まあ、そこそこ確実(+それなりに速い)と思う Google Chrome だと、AXWebArea が System Event's UI elements にねー、
なかなか出てこねー、が顕著なのか
Google Chrome は使ってなくて、Brave Browser を使ってるが、そっちはたまにでWindow前後したりしたら出るんだが
Google Chromeはほそれでは出てこない、Accessibility Inspectorで見る(触る)と出てくるかな、ほぼ確実に
なんだろ。ChromeなのかSystem Eventsなのかどっちが悪いねん。Brave Browser との差異からはChromeぽいけど
どうせ欲しいのはWindow内でのAXWebAreaの位置そしてToolbarなんぞを出したり引っ込めたりしないからだろうから、
position of first group of front window + 定数
でいいか。AXWebAreaがあるんだから使いたいとこだが
検索のちっちゃい検索のためのはWindowのようで、それを考慮すると System Events では、
front window
でなく、
first item of (windows whose subrole is "AXStandardWindow")
がかな。上記のは
position of first group of (first item of (windows whose subrole is "AXStandardWindow")) + 定数 お知恵をお貸しいただけないでしょうか。
スクリプトは見よう見まねで自分用に多少書き替える程度のことはできる、という最低レベルです(基本がわかっていないので応用が効かず……)
Pandocを使ってマークダウン書類をWord書類に変換したく、四苦八苦しています。
ターミナルからのコマンド入力でどうにか成功したものの、毎回入力は面倒です。
Appleスクリプトなら解決できるのではないかとWebをさまよっていたところ、下記スクリプトを見つけました。
https://github.com/nathan-artist/AppleScripts/blob/master/AppleScript%20droplet%20for%20pandoc%20file%20conversion.applescript
早速アプリケーションにしてみました。
成功はしたのですが、ここからがご相談です。
こちら、変換コマンドのオプションが書けるようになっており、オリジナルは
--standaloneなのですが、
--reference-doc=○○.dotx
に変更しました。
マークダウン書類と同一階層に自分で作ったdotx(Wordテンプレート書類)を置いて実行しています。
が、本来Wordのテンプレート格納場所は以下です。
/Library/Group Containers/UBF8T346G9.Office/User Content.localized/Templates.localized/○○.dotx
できればここから引っ張って来たいのです。
が、ファイルパスを書くとエラーが出てしまいます。(ターミナルから入力していたときはパス指定で成功していました)
うまく解決する方法はありますでしょうか。
ちなみに、Wordテンプレートは一種類ではなく、文章の中身によって変えたいです。
よろしくお願いいたします パスのスペースをエスケープするなり、パス全体をシングルクォーテーションで囲ってはどうか >>736
スペース含むファイル名のみをシングルクォーテーションで囲ったらなんとかうまくいきました
助かりました、本当にありがとうございました! tell application "Finder"
activate
count item of folder "Macintosh SSD:Users:ユーザーname:downloads"
if the result = 1 then
set Downfile to document files whose name extension is "pdf"
open Downfile
------以下続きます
返された値では
get every document file whose name extension = "pdf"
この様に処理され、デスクトップにあるpdfファイル全てを開く事になってしまいます。
ダウンロードフォルダ内にあるpdfファイルのみを開くにはどのように記述すればよいですか? 開くだけでいいならこれ1行で
do shell script "open ~/Downloads/*.pdf" >>740様
すごい!!
ありがとうございました。
助かりました。 突き詰めるほどにdo shell scriptが増えてくるのは俺だけ? 何度もすみません
ダウンロードフォルダにあるpdfファイルを変数に入れるにはどう書けば良いですか?
set Dfile to document files whose name extension is "pdf" of (path to downloads folder)
エラー
"pdf" of (path to downloads folder)を取り出すことはできません。利用が許されていません。 >>744
tell application "Finder"
set Dfile to files of (path to downloads folder) whose name extension is "pdf"
end tell >>744様
なかなか思い通りに動かせなくて困っておりました。
ご親切に教えて頂きましてありがとう御座いました。 どなたか教えてください。
特定のフォルダのウインドウサイズと位置をフォルダを開かずにサイズと位置を変更する方法はありませんか?
ウインドウを開く前にウインドウサイズと位置を設定したいです。 そういうのは.DS_Storeに保存されるんだろうけど、方法ないんじゃないの >>748
そのファイルはもうお亡くなりになりました…
前にも同様のDS_storeとfinderのwindow位置で書いたわ。
~/Library/Preferences/com.apple.Finder.plist
の消去をするとリセットされるぐらいしか無くて、解決しなかった。
むしろ元に戻ると言う報告もあってお手上げだったよ🤷🤷♂ レスありがとう。
やはり方法はないんですね。
実は、Big Sur以降MontereyでもMacintosh HDのFinderウインドウサイズが再起動するとリセットされてしまい小さなウインドウサイズに変わってしまうバグがあるけど(Time Machineの外付けHDDのウインドウも同じバグが)、
いちいち起動ごとにリサイズするのが面倒なので、今は
Macintosh HDのFinderウインドウを開く -> リサイズ -> 閉じる
ってAppleScriptを作って起動項目にいれてるのですが、
Macの起動時に一瞬ウインドウが見えて消えるのが嫌な感じだな…と思いつつ使っていて何か改善方法はないかと思って質問をしました。
方法がもうないのなら今の方法で対応するしかない感じですね。 フォルダアクションで開いた時に修正リサイズするとか >>751
なるほどーその手もあるんですね。
しかしその場合だと開くたびに同じ修正値にリサイズされるので
デフォルトサイズ以外だとリサイズしない設定も加える必要があるでしょうね。
ちょっと頑張ってやってみます。
レスありがとうございます。 質問ばかりで申し訳ありません。
また一つ教えていただきたいのですが、
Macの起動や再起動時に文字入力を英字(A)にしたくて下記のAppleScriptを使っていますがうまく英字にならず日本語になってる事があります。
tell application "Finder"
tell application "System Events"
keystroke ";" using {shift down, control down}
end tell
end tell
tell application "Finder”はあってもなくても動作が思ったようになりません。
どこか手直しすればいいのか、他に何かいい方法(AppleScriptにこだわってはいません)はないでしょうか。 tell application "Finder"
は、いらない
フロントアプリ(まあ、Finderなんだろうけど)や、Input Methodの準備が整ってない段階でkeystrokeを発行する時があるんじゃないの
とりあえず delay 60 とか(起動で落ち着くまで)最初に入れてみるとか。それで大丈夫なようだったら、次を考えようw
http://piyocast.com/as/archives/5068
って、Cocoa APIで直接とかあるな。よく読んでないけど、Cocoa APIなら確実性はありそうかな
現在のモードを取得とかもあるんじゃないかな。あるんだったら、準備ができてなくてなら失敗しても待って繰り返すとかできそうかな あ、Cocoa APIじゃなく(Cocoa APIを使った)有志のフレームワーク使ってた
フレームワーク使わずにできるか見てみるわ >>754
レスありがとうございます。
Finderの部分は必要ないんですね。
最初delayを入れてたけど、効果ないのかなと思って外してたけど
落ち着くまでの適当な秒数入れたほうがいいんですね。
>フレームワーク使わずにできるか見てみるわ
お手数をおかけします。
ありがとうございます。 フレームワークで使ってる Core な C API でなく、Objective-C クラスあるやんけ
Objective-C クラスだとなんか問題あるのかな?わからんけどw、書き換えると
set kHiraganaInputSource to "com.apple.inputmethod.Kotoeri.Japanese"
set kEisuuInputSource to "com.apple.inputmethod.Kotoeri.Roman"
set inputContext to current application's NSTextInputContext's currentInputContext
repeat 3 times
set inputContext's selectedKeyboardInputSource to kHiraganaInputSource
delay 1
set inputContext's selectedKeyboardInputSource to kEisuuInputSource
delay 1
end repeat
InputSource名は決め打ちw。まあ変わることは無いだろう
selectedKeyboardInputSource で現在のを取れるし設定できる >>757 ということで
use framework "AppKit"
on chaaaaange()
--set kHiraganaInputSource to "com.apple.inputmethod.Kotoeri.Japanese"
set kEisuuInputSource to "com.apple.inputmethod.Kotoeri.Roman"
repeat
set inputContext to current application's NSTextInputContext's currentInputContext
try
set inputContext's selectedKeyboardInputSource to kEisuuInputSource
if inputContext's selectedKeyboardInputSource as text is kEisuuInputSource then return
on error message
return message
end try
delay 1 -- wait for challenge to next time
end repeat
end chaaaaange
chaaaaange()
な感じ?
>>758
そんなのもあるのねえ。実績があるのならそっちかなw >>759
あ、
on error message
return message
は、いらない。あったらリトライせずに終わることもある
なかったら無限になりえるけど、まあ無いだろうし、無限になっても影響は無いだろうw on changeKeyboardLayout(layoutName)
tell application "System Events" to tell process "SystemUIServer"
tell (1st menu bar item of menu bar 1 whose description is "text input") to {click, click (menu 1's menu item layoutName)}
end tell
end changeKeyboardLayout
changeKeyboardLayout("U.S.")
普通にusになるまでインプットソースをロールさせるのがいいんじゃね(拾い物) Objective-C ラスのは、スクリプトエディタ以外で走らせるのは何か準備が必要のようかなあ
とりあえず、オススメはしないw すまん
selectedKeyboardInputSource ってプロパティを見る弄るだけなので俺の好みだけど
以下、どうにか使うようにするのは俺の趣味だな みなさんこんな時間にも関わらずレスをいただき感謝します。
どれがいいか順番に試してみたいと思います。
しかしみなさん詳しくて頭が下がります。 私の環境(BigSur 11.6.4)だとこれで動く
ただ英字のclickに数秒待たされる場合があるのでこまめな切り替え処理には向いてなさそう
tell application id "com.apple.systemevents"
tell application process "TextInputMenuAgent"'s menu bar 2's menu bar item 1
click
--delay 1 --動かない場合があるなら少し遅らせた方が確実かも
tell menu 1's menu item "英字" to click
end tell
end tell なるほど、どれにしても少し待つ事が重要そうですね。 大量のフォーム入力されたPDFをレーザープリンタにてA4、両面印刷する場面が近々あるのですが、
Appleスクリプトでdo shell scriptで印刷テストしたところ、フォームの内容が全部すっ飛んだ状態でプリントされてしまいました
lpr プリンタ名 -o media=A4 -o landscape-o sides=two-short-edge -o fliplot ファイル
プレビューにてSystem eventでメニューポチ、プリントポチだとdelayが上手くハマらない?場面で失敗してしまい、なかなかうまくいきません
MacOS 10.15.7です
アドバイスお願いします すみません、上のコマンドに-o l入れ忘れてました…
入れてもフォームが全部空っぽになってしまいます しかもfitplot の綴り間違えてるし
なんか他にも間違えてそう >>766
CUI/コマンドでの方がスマートに 見える かもしれないが、macOS/Finderにあるのに使われないw、Print/印刷コマンド使えば
Finder で PDFファイルを選んで、ファイル メニューにあるやつ
> プレビューにてSystem eventでメニューポチ、プリントポチだとdelayが上手くハマらない?場面で失敗してしまい、なかなかうまくいきません
ってやろうとして、コマンドでなのか。だったら、上記のFinderからので良さげのような
なんだったらわざわざAppleScriptでやる必要もないような、その大量の数がわからんけど、そのFinderの使ってのAppleScript書くのはそう難しくはないだろう ■ このスレッドは過去ログ倉庫に格納されています