AppleScript アップルスクリプト 質問、発表 8

0001名称未設定2023/03/25(土) 06:38:03.65ID:4gHvNmU30
質問、発表どっちでもスレ。

■注意
安直なスクリプト作成依頼、丸投げ、「こういうの作ってください!」はお断り。
わからない点、エラーが解決できない点についてはスクリプト片を添えて質問すること。
OSバージョンも忘れずに。

■参考
AppleScript Language Guide
https://developer.apple.com/library/mac/documentation/AppleScript/Conceptual/AppleScriptLangGuide/
TN2065: do shell script
https://developer.apple.com/library/mac/technotes/tn2065/
AppleScript: The Language of Automation
http://www.macosxautomation.com/applescript/
MacWiki - AppleScript
http://macwiki.osdn.jp/wiki/index.php/AppleScript
鳶嶋工房 / AppleScript
http://tonbi.jp/AppleScript/
AS Hole(AppleScriptの穴)
http://piyocast.com/as/

■過去スレ
https://egg.5ch.net/test/read.cgi/mac/1491018171/
https://potato.5ch.net/test/read.cgi/mac/1387630245/
https://anago.5ch.net/test/read.cgi/mac/1330350325/
https://anago.5ch.net/test/read.cgi/mac/1256127156/
https://pc11.5ch.net/test/read.cgi/mac/1223026902/
https://pc11.5ch.net/test/read.cgi/mac/1197443062/
https://pc11.5ch.net/test/read.cgi/mac/1174045850/

0107名称未設定2023/07/27(木) 17:09:09.76ID:eQcQ7Kl+0
Venturaで
システム設定.app>一般>ストレージ>すべてのボリューム
を開くスクリプトって可能でしょうか

0108名称未設定2023/07/27(木) 17:14:56.53ID:iim/O9ns0
頑張れ

0109名称未設定2023/07/27(木) 17:34:07.43ID:ApvlEs4i0
うんこぶりぶり

0110名称未設定2023/07/27(木) 17:54:15.26ID:um6pLo6D0
>>107
tell application "System Events" to get every disk

0111名称未設定2023/07/27(木) 18:42:45.19ID:eQcQ7Kl+0
ありがとうございます
>>108さんのアドバイスで解決しました
頑張る、なんてコマンド、リファレンスのどこにも書かれていない...(´・ω・`)

on run {input, parameters}
tell application "System Settings"
activate
reveal pane id "com.apple.systempreferences.GeneralSettings" -- works as expected
delay 1
tell application "System Events"
tell process "System Settings"
click button 3 of group 1 of scroll area 1 of group 1 of group 2 of splitter group 1 of group 1 of window "一般"
delay 4 --接続している外部機器がスリープしている場合、すべてのストレージ機器がウェィ苦するまでに要する時間にする
click button 1 of group 1 of scroll area 1 of group 1 of group 1 of group 2 of splitter group 1 of group 1 of window "ストレージ"
end tell
end tell
end tell
end run

ショートカット化して「cmd-F19」で起動可能にして便利になたよ(`・ω・´)

0112sage2023/09/09(土) 09:06:08.82ID:chRMarHQ0
JavaScript(JXA)をAutomatorで効率的に実行する方法についての
質問です。現在は同じ内容のJavaScript(JXA)を
「ライブラリー==>JavaScriptを実行」で複数回
次のようにAutomatorに書き込んでいます。

function run(input, parameters) {
 [50行の同一のJXA]
return input;
}

この[50行の同一のJXA]を外部ファイルに書き出して,それをAutomator
から実行する(呼び出す)方法はございますか? 
なお「同じ内容のJavaScript(JXA)」の前後には,Automatorで
JXA以外のコマンドを実行しております。

0113名称未設定2023/09/09(土) 11:03:09.67ID:X6t5qLrj0
https://developer.apple.com/library/archive/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/Articles/OSX10-10.html#//apple_ref/doc/uid/TP40014508-CH109-SW14

Libraries
To use scripts as libraries, store them in ~/Library/Script Libraries/.

これがそのまま通じるようだったけど

0114sage2023/09/09(土) 14:35:16.01ID:chRMarHQ0
ご教示ありがとうございます。(1)フォルダーを作成し:
mkdir ~/Library/Script Libraries/
(2)そこにQuickTimeを制御するplayQt.scpt起き
function playMov() {
quickTimePlayer = Application("QuickTime Player");
quickTimePlayer.activate();
途中省略
}

(3)Automatorの方には次のようなJXAを書き込み
function run(input, parameters) {
toolbox = Library('playQt');
toolbox.playMov();
return input;
}

Automatorを実行すると,「Automatorが予期しない理由で終了しました」となりエラーが発生しました。
試しに(2)のスクリプトを次のように実質空にしても
function playMov() {
;
}
同じエラーメッセージが発生するので,(3)に問題があるようです。

0115名称未設定2023/09/09(土) 16:35:45.33ID:GVt2qfmi0
(3)の中の2行は、Automatorでなしに、スクリプトエディタ上では動くの?
toolbox = Library('playQt');
toolbox.playMov();

0116sage2023/09/09(土) 20:01:13.47ID:chRMarHQ0
>>115
>スクリプトエディタ上では動くの?
スクリプトエディタ上で(3)を実行すると
「スクリプトエディタが予期しない理由で終了しました。」と
エラーメッセージが表示され,クラッシュします。
2行目のtoolbox.playMov();を削除して
toolbox = Library('playQt');だけを実行すると
クラッシュはせず,エラーメッセージも表示されませんが
(予想通り)何も起こりません。

0117sage2023/09/09(土) 20:40:36.00ID:chRMarHQ0
>>113
ここに紹介されているtoolbox.scptをコピペして
スクリプトエディタから,同じく紹介されている:
toolbox = Library('toolbox')
toolbox.log('Hello world')
を実行しても,「スクリプトエディタが予期しない理由で終了しました。」
と表示されて,クラッシュします。
 どこかで致命的なミス・思い違いをしているかもしれません。

0118名称未設定2023/09/10(日) 07:43:40.20ID:63TOklfs0
JXAの実行環境がぶっ壊れてるのかも

作りかけのJXAスクリプトであっけなくクラッシュしてしまうことは時々あるけど、今回のスクリプトは間違ってるわけでなし、うちでは動く

01191182023/09/10(日) 08:17:24.02ID:iEK5/xd+0
ご報告
別OSで試してみたらクラッシュしたw

どちらも古いけど
High Sierraでは動く
Catalinaではクラッシュ

0120名称未設定2023/09/10(日) 08:34:25.45ID:uTX78pbU0
ググったら解決策があった
https://stackoverflow.com/questions/69887840/load-script-library-in-jxa-applescript-js
scptでなく、scptd (Script Bundle)で保存

これでCatalinaで動いた

0121名称未設定2023/09/10(日) 08:39:54.78ID:uTX78pbU0
ID変わったけど同じ者

0122117,1162023/09/10(日) 13:20:58.13ID:zhde7ZtV0
>>120
ありがとうございます。家に帰り次第,試してみます!

0123sage2023/09/10(日) 19:20:04.66ID:gle52nXw0
>>122
「実効専用」の「scptd (Script Bundle)で保存」して
見事,動きました!!! Ventura13.4.1では
「実効専用」のチェックボックスを
チェクしないと,動かないようです。

01241232023/09/14(木) 09:34:29.15ID:LjTlinaE0
(2)のJXAで,動画ファイル/Users/taro/13.mp4を開こうとすると,
 (1)「書類“13.mp4”を開けませんでした。
   このファイルはQuickTime Playerと互換性がありません。」
というエラーが表示されます。
 (2) quickTimePlayer = Application("QuickTime Player");
   quickTimePlayer.activate();
   result1 = quickTimePlayer.open("/Users/taro/13.mp4");
しかし(2)を実行する直前に:
 (3) この動画ファイル13.mp4をQuickTime Player.appで開き
   次にQuickTime Player.appを終了(Quit)する
作業を行い,その後に(2)を実行すると,(1)のエラーは表示されずに
正常に動画13.mp4が再生されます。
 ご教示いただきたいのは,(3)の作業を行わずに,直接(2)の
ようなJXAだけで正常に動画13.mp4を再生する方法です。
よろしくお願いします。

0125名称未設定2023/09/14(木) 10:38:53.31ID:a3ZfMKVf0

0126名称未設定2023/09/14(木) 10:42:09.43ID:eXesN4Bq0
>>124
>quickTimePlayer.open("/Users/taro/13.mp4");
quickTimePlayer.open(Path("/Users/taro/13.mp4"));
JXAでファイルパスは単なる文字列表現で済ますのではなく、Pathで明示した方がいいだろう

0127名称未設定2023/09/14(木) 10:42:55.50ID:eXesN4Bq0
>>125
被った。そだねえ

01281232023/09/14(木) 10:56:24.98ID:LjTlinaE0
無事解決できました。いつもありがとうございます!

0129名称未設定2023/09/23(土) 00:20:22.81ID:IY+9UYOO0
変数が 0 なら 1 を代入するスマートな方法ある?

0130名称未設定2023/09/23(土) 01:55:15.11ID:lC4/k50A0
try
A * 1
on error
set A to 1
end try

---

item ((A / A) + 1) of {1, A}
set A to result

0131名称未設定2023/09/23(土) 04:11:04.50ID:sFUrl3EY0
結局ベタが一番な気が
if x is 0 then set x to 1
x = x === 0 ? 1 : x;

0132名称未設定2023/09/30(土) 20:46:51.36ID:7T7n9Pw50
Dockから特定のアプリを削除
Dockに特定のアプリを登録
これわかんねー

0133名称未設定2023/10/08(日) 02:59:22.19ID:bQMpxACO0
DockもAppleScript対応して欲しいもんだ

0134名称未設定2023/10/15(日) 19:43:16.88ID:YNkZQK1R0
SonomaでNight-shiftをapplescriptで実行する方法ご存知ありませんか?
https://github.com/ravicious/toggle-night-shift
これは試してみましたがダメでした。

本当は「カラーを反転」の状態でNight-Shiftをやりたいのですが
デフォルトではNight-Shiftで自動的にカラー反転が戻ってしまいます。
そこでカラープロファイルを2つ用意してトグルするともう一度反転が起こって
Night-Shiftとカラー反転を両立できるところまで分かっているのですが、
それをスクリプトで実行したくて質問したものです。

0135名称未設定2023/10/16(月) 02:49:48.86ID:+ATjpBY00
GUI scriptingでコントロールセンターを操作するとか

0136名称未設定2023/10/16(月) 14:10:09.50ID:QTXD08XT0

0137名称未設定2023/10/19(木) 13:33:15.36ID:lQy+IAGn0
ご返事ありがとうございます。
Python は無知ですのでハードルが高そうですけど試してみます。

0138名称未設定2023/10/20(金) 03:43:56.56ID:/Qbn3qeO0
そこのグレースケールを操作するところの話、JXAで

var bundle = $.CFBundleCreate($.kCFAllocatorDefault, $.NSURL.fileURLWithPath('/System/Library/PrivateFrameworks/UniversalAccess.framework'));
var UAGrayscaleSetEnabled = $.CFBundleGetFunctionPointerForName(bundle, $('UAGrayscaleSetEnabled'));
ObjC.bindFunction('UAGrayscaleSetEnabled', ['void', ['bool']]);

$.UAGrayscaleSetEnabled(true);

0139名称未設定2023/10/22(日) 11:04:42.65ID:ujAeEBxd0
Night Shiftの設定、JXAで
ObjC.import('CoreBrightness') が使えなかったんでこんな風にしてみた
合ってんだか合ってないんだか

ObjC.import('objc');
$.NSBundle.bundleWithPath('/System/Library/PrivateFrameworks/CoreBrightness.framework').load;
$.CBBlueLightClient = $.objc_getClass('CBBlueLightClient');

var client = $.CBBlueLightClient.alloc.init;
client.setEnabled(true);

0140名称未設定2023/10/25(水) 23:18:00.58ID:x0BI0MYx0
システム環境設定を開かずに優先する言語を逆順に入れ替えるJXA一行
$.NSLocale.setPreferredLanguages($.NSLocale.preferredLanguages.reverseObjectEnumerator.allObjects)

普段は英語を優先してて日本語にすることもあるものの、毎度システム環境設定を開いて入れ替えるのが面倒になった
なお10.13 High Sierraではメニューバーの時計の表示は(システム環境設定を開いて変更したときのように)連動して変わってくれないのが難点

01411232023/10/27(金) 10:02:02.02ID:YFWw4ZOQ0
>>134
>SonomaでNight-shift
画面の明るさの話題が出たので関連質問です。
スクリプトエディター.appの真っ白な背景色を
変更する方法などはございますでしょうか? 
システム設定>アクセシビリティ>カラーを反転
だと,スクリプトエディターはダークになりますが
他のダークモード対応のアプリ・画面が白く輝き
目が疲れてしまいます。

0142名称未設定2023/10/27(金) 10:46:31.09ID:gy+qqABI0
Script Debugger 8 試したら
8でDark Mode対応
試用期限20日後は"lite"モードになって使える

0143名称未設定2023/10/27(金) 10:50:12.16ID:gy+qqABI0
> 試用期限20日後は"lite"モードになって使える

Dark Mode対応がどうなるかは不明

01441232023/10/27(金) 18:05:27.24ID:+VQCFrfI0
存在を知りませんでした! ここを見ると:
http://piyocast.com/as/archives/tag/script-debugger
背景が黒にできるので,これを使います!
貴重な情報をありがとうございます。

0145名称未設定2023/11/03(金) 23:21:28.92ID:J/5IhoXs0
ターミナルで
printf 'あ' | pbcopy -pboard find
ってやると検索文字に入るのにdo shell scriptだと入らないのなんなん

0146名称未設定2023/11/03(金) 23:32:29.70ID:J/5IhoXs0
自決
これで逝けました
do shell script "export LANG='ja_JP.UTF-8'; printf 'あ' | pbcopy -pboard find"

0147名称未設定2023/11/11(土) 16:52:53.29ID:FmhRWB130
JXAで、ObjC.import('signal')すると、定数宣言されてるsys_signame(やsys_siglist)が見えそうなんだけど、$.sys_signameでクラッシュしてしまって(Segmentation fault: 11)何もできない
どうにか中の文字列を読めないか悩んでたのがとりあえず解決したので記録(元々これ使って何がしたかったって訳でもなく、import関係なくなっちゃったけど)

結論としては、dlsym()の戻り値を本来の'void*'から'void**'に変えてみるとポインタが指す先の文字列を読めた('void*'のままだとポインタそのものは見えるけど、その先はどうにもできなかった)

なお、このimportで参照されるのは/System/Library/PrivateFrameworks/JavaScriptAppleEvents.framework配下、BridgeSupportCache下signal.plistで、sys_signame(やsys_siglist)のtypeは[32*]
元となるsignal.hでの宣言は
extern __const char *__const sys_signame[NSIG]; 等、内容は https://opensource.apple.com/source/Libc/Libc-1244.50.9/gen/FreeBSD/siglist.c.auto.html のように
const char *const sys_signame[NSIG] = {
"Signal 0",
"hup", /* SIGHUP */
"int", /* SIGINT */ 等、これは/usr/lib/system/libsystem_c.dylib内にある

0148名称未設定2023/11/11(土) 16:53:27.38ID:FmhRWB130
続き

読み出し例:
ObjC.bindFunction('dlopen', ['void*', ['char*', 'int']])
ObjC.bindFunction('dlsym', ['void**' /* 本来は 'void*' */, ['void*', 'char*']])
libref = $.dlopen('/usr/lib/libc.dylib', 2 /* RTLD_NOW */)
ptrref = $.dlsym(libref, 'sys_signame' /* または 'sys_siglist' */)
strs = []
for (i = 0; i < 32; i++) {
str = ''
for (j = 0; ; j++) {
if (ptrref[i][j] == 0) {
strs.push(str)
break
}
str += String.fromCharCode(ptrref[i][j])
}
}
strs.forEach((str, i) => console.log(i, str))

結果:
/* 0 Signal 0 */
/* 1 hup */
/* 2 int */ 等

他にも似たようなのあるけど、import用の.plistって、.hから機械的に変換、生成してるだけで、簡単に使えないのも混ざってるぽい

0149名称未設定2023/11/13(月) 22:12:12.75ID:aSkuUmIr0
今更ながら前スレ https://egg.5ch.net/test/read.cgi/mac/1491018171/669 のJXA版

ObjC.import('AppKit')
ObjC.import('IOKit') // NX_KEYTYPE_SOUND_UP, etc.
ObjC.import('objc')
var fkey = $.NX_KEYTYPE_SOUND_UP
function fkeydown(fkey, down = true) {
var nil = $()
var flags = down ? 0xa00 : 0xb00
var event = $.NSEvent.otherEventWithTypeLocationModifierFlagsTimestampWindowNumberContextSubtypeData1Data2($.NSSystemDefined, $.NSZeroPoint, flags, 0, 0, nil, 8, ((fkey << 16) | flags), -1)
// $.CGEventPost($.kCGHIDEventTap, event.CGEvent)では動かない。無視される(システムログにエラー'Invalid event'が出る)か、クラッシュする
$.CGEventPost($.kCGHIDEventTap, event.performSelector($.sel_registerName('CGEvent')))
}
fkeydown(fkey)
fkeydown(fkey, false) // fkeyup

時々思い出しては解決できずにもやもやしてたけど、これでどうにか気が晴れた

0150名称未設定2023/12/14(木) 13:14:31.45ID:zezJY19P0
MBPが壊れて買い換えて大幅に環境が変わったらAppletが動かなくなってた。色々影響あるのかな? すいません独り言の愚痴でした

0151名称未設定2023/12/15(金) 08:32:16.45ID:PTesWRWe0
再保存、Script Editorで開いて保存しなければ動かないってあったな

0152名称未設定2024/03/03(日) 04:30:45.67ID:Xj5rIMR50
iTermで現在のフォルダ名を記述するスクリプトを作りたいのですが
https://daeudaeu.com/finder-terminal/
を参考に下記を実行してみましたが
動作してくれません。
どなたか解決方法ご存知ありませんか?
iTermがデフォルトのTerminalでなくても実行できるようにしたいのですが。

on run {input, parameters}

tell application "Finder"
set hfsCurrentFolder to insertion location as Unicode text
set currentFolder to get POSIX path of hfsCurrentFolder
end tell

set command to "cd " & currentFolder

tell application "iTerm"
do script command
activate
end tell

end run

0153名称未設定2024/03/03(日) 09:46:55.58ID:ms+RoSBt0
iTermの用語説明を調べるなりhttps://iterm2.com/documentation-scripting.html調べるなりした方がいいと思うけど
do scriptってTerminalの用語じゃないの

0154名称未設定2024/03/03(日) 10:23:56.17ID:ms+RoSBt0
見たところcreate tabかcreate windowにcommand "command"あるけど、それを実行してもsession終わって閉じちゃうようだし、write text "text"の方かな
create window with default profile
tell current session of current window
write text "cd ~/Desktop"
end tell
とか

0155名称未設定2024/03/03(日) 12:19:33.20ID:Xj5rIMR50
ご教示ありがとうございます。
下記を試してみましたが上手く行きませんでした。
mycommandをテキスト化できていないと思うのですが。
----------------------------------------

on run {input, parameters}

tell application "Finder"
set hfsCurrentFolder to insertion location as Unicode text
set currentFolder to get POSIX path of hfsCurrentFolder
end tell

set mycmd to "cd " & currentFolder

tell application "iTerm"
create window with default profile
tell current session of current window
write text mycmd
end tell

end run

0156名称未設定2024/03/03(日) 12:34:44.59ID:ms+RoSBt0
tell と end が対になってないじゃん
それに、動作してくれません、上手くいきませんじゃなくて、エラーメッセージちゃんと書かないと
それと、いきなり組み込むんじゃなくて、あの程度なら、外から渡す変数もないようだし、スクリプトエディタで確認した方がいい

すまん、文句しか出ないw

0157名称未設定2024/03/03(日) 12:50:00.54ID:Xj5rIMR50
ありがとうございます!
end tell を追記したら上手く行きました。

新着レスの表示
レスを投稿する