お知らせ:


 ◇ YouTube Apple Japan チャンネル で有用なヒントや使い方を配信中です。
 ◇ iOS 向け Apple サポート App のバージョン 2.4.1 が公開されました。

しばらく返答が寄せられていないようです。 再度ディスカッションを開始するには、新たに質問してください。

質問:

質問: AppleScriptのドロップレットの呼び出し回数が不定

スクリプトエディタでAppleScriptのドロップレットを作成したのですが、

期待したとおりの動きをしません。


トラブルシュート用に以下のドロップレットを作成しました。

----

on open (these_items)

display dialog "called"

end open

----


期待:

このドロップレットに複数ファイル・フォルダをドロップしても、

1回だけ「called」と書かれたされたダイアログが表示される。


実際:

ドロップするファイルによって、振る舞いが変わります。

例えば、Excelで作成したファイルと、スクリーンショットのpngを一緒にドロップすると、

2回ダイアログが表示されます。

しかし、スクリーンショットのファイルを2つドロップすると、

1回ダイアログが表示されます。



原因が分かる方はいらっしゃいませんか?

また、対応策はありませんか?


環境: MacOS High Sierra (10.13.3)

MacBook Air, macOS High Sierra (10.13.3)

投稿日

返信
スレッドに付いたマーク この回答で解決
回答:
回答:

添付されたAppleScriptを私の環境でも少し試してみたのですが、うまく再現できませんでした。 .xlsx, .doc, .workflowなどのファイルを、他のファイル(.xml, .plist, .txt, .rtf)と合わせて最大8つ程度、ドロップしたのですが、quitの中のdisplayは正常に動いている様です。 ドロップしたファイルの数が少ないのかもしれません。 『うまくいかないファイル』に何らかの共通点があればヒントになるかもしれないです。 しかしながら、バグの中身が不明なので、回避方法を決めるのも難しいです。


私自身はドロップレットをあまり作ったことがないのですが、フォルダアクションは多用しています(稀にうまく処理できないこともあります)。 大量のファイル(カメラ画像など)をフォルダアクションを使って写真ライブラリにコピーする処理で、一部のファイルがうまくコピーできないというトラブルは時々、このコミュニティーにも報告されています。 しかしながら、不具合の原因や対処方法は特定できていないです。


AppleScriptのコードの色付けは、Script Editor.appでコンパイルしたコードをコピペしています。 ただし、そのままだと、インデントがマイナスになってしまうので、『高度なエディタを使用』のコマンドを使ったり、HTMLソースコードを表示させて編集しています。 こちらのUser Tipsも参考になります。

 → Bookmarklet to fix AppleScript pasting on discu... | Communities 

投稿日

ページコンテンツが読み込まれました

2018/02/03 11:08 ks34 への返信 ks34 への返信

失礼致します。 


私の環境(macOS 10.13.3, AppleScript ver. 2.7, Script Editor ver. 2.10)でも同様の現象を確認できました。 .DOCや、.workflowの拡張子をもつファイルでも、2回ダイアログが表示されます。 しかしながら、.DOCのファイル2つや、.workflowのファイル2つ、あるいは、両方のファイル1ずつの時は、1回のダイアログしか表示されないです。


原因は私には解りません。 しかしながら、呼び出し毎にthese_itemsの内容を表示してみると、these_itemsの全体に対して、2回呼び出している訳ではなく(つまり、同じファイルに対して、2回呼び出している訳ではなく)、.Docや.workflowのファイルを区別する形で2回呼び出している様です。 

2018/02/03 11:08

返信 参考になった

2018/02/03 12:49 T22T への返信 T22T への返信

ご指摘の通り、ドロップしたファイルを重複して呼び出すことはないようですね。


ただ、スクリプトが2回以上呼び出されてしまうと、

今想定している作りがうまくいかないのです。。


ドロップしたファイルを1つのzipにまとめたい、という思いから、

このドロップレットにチャレンジしております。


these_itemsに渡されたファイルをzipの引数に渡す、という作りを想定しており、

スクリプトが2回呼び出されてしまうと、うまく1つにまとめられなくなってしまうのです。

2018/02/03 12:49

返信 参考になった

2018/02/03 16:12 ks34 への返信 ks34 への返信

AppleScriptのバグっぽいので、Appleへフィードバックした方がいいかもしれないです。


グローバル変数を使うことで、these_itemsを一つのリストにまとめることができそうです(少し変な感じがしますが)。


property aList : {}


on open (these_items)

repeat with thisItem in these_items

set aList to aList & thisItem

end repeat

end open


on quit


-- aListのファイルを圧縮する処理

set aList to {}

end quit

2018/02/03 16:12

返信 参考になった

2018/02/05 10:31 T22T への返信 T22T への返信

検討頂き、ありがとうございます。

バグかもしれないとのことで、フィードバックしました。


暫定対応として、

サンプルとして記載頂いたスクリプトを試しましたが、

どうもうまくいきません。


--- [sample code]

property aList : {}


on open (these_items)


repeat with thisItem in these_items

set f to quoted form of ((POSIX path of thisItem) as Unicode text) --まずPOSIX pathにする

display dialog "posix: " & return & f

set aList to aList & f & return

end repeat


display dialog "open: " & return & aList


end open


on quit

display dialog "quit: " & return & aList

set aList to {}

end quit


いくつかのファイルをドロップすると、

うまくいくファイルと、うまくいかないファイルの2種類かあります。


うまくいかなかったファイルを2つドロップすると、

quitのなかのdisplayが動きませんでした。


AppleScriptでドロップレットを作成するのは、

あまり推奨されないのでしようか。。



(話が変わりますが、投稿するコードの色はどのようにつけているのですか?)

2018/02/05 10:31

返信 参考になった
スレッドに付いたマーク この回答で解決

2018/02/05 12:38 ks34 への返信 ks34 への返信

添付されたAppleScriptを私の環境でも少し試してみたのですが、うまく再現できませんでした。 .xlsx, .doc, .workflowなどのファイルを、他のファイル(.xml, .plist, .txt, .rtf)と合わせて最大8つ程度、ドロップしたのですが、quitの中のdisplayは正常に動いている様です。 ドロップしたファイルの数が少ないのかもしれません。 『うまくいかないファイル』に何らかの共通点があればヒントになるかもしれないです。 しかしながら、バグの中身が不明なので、回避方法を決めるのも難しいです。


私自身はドロップレットをあまり作ったことがないのですが、フォルダアクションは多用しています(稀にうまく処理できないこともあります)。 大量のファイル(カメラ画像など)をフォルダアクションを使って写真ライブラリにコピーする処理で、一部のファイルがうまくコピーできないというトラブルは時々、このコミュニティーにも報告されています。 しかしながら、不具合の原因や対処方法は特定できていないです。


AppleScriptのコードの色付けは、Script Editor.appでコンパイルしたコードをコピペしています。 ただし、そのままだと、インデントがマイナスになってしまうので、『高度なエディタを使用』のコマンドを使ったり、HTMLソースコードを表示させて編集しています。 こちらのUser Tipsも参考になります。

 → Bookmarklet to fix AppleScript pasting on discu... | Communities 

2018/02/05 12:38

返信 参考になった

2018/02/07 10:50 T22T への返信 T22T への返信

一緒に検討頂いてありがとうございました。


返信が遅れてしまいましたが、

ドロップレットとしての実装を諦め、

Automatorを使って、ダブルクリック後に

圧縮対象ファイルを指定させるように変更したいと思います。



コードの貼り付け方についても、ありがとうございました。

safariで貼り付ければ良かったのですね。

そして、インデントの問題についても合点がいきました。

ブックマークレットを使えば直ることも分かりました。

( firefoxで作業をしていたので、気付きませんでした。 )

2018/02/07 10:50

返信 参考になった

2018/03/03 16:27 ks34 への返信 ks34 への返信

失礼いたします。

私も以前同様の現象が発生しました。



もしかするとダウンロードファイルなどに付加される

EA (Extended Attributes)と呼ばれる情報が原因かもしれません。



下記はFinderで選択状態の項目に対してEAを削除するものです。

Excelで作成したファイルと、スクリーンショットのpngの

どちらかにEAが含まれている可能性がありますので

バックアップを取られたのちに実行してみてください。


on run

tell application "Finder"

set sels to selection as alias list

repeat with sel in sels

try

do shell script "/usr/bin/xattr -d com.apple.quarantine '" & (POSIX path of sel) & "'"

end try

end repeat

end tell

end run



以前 Piyomaru Softwareさんの記事の

「com.apple.quarantineがドロップレットに与える影響」で

見かけたのですが、サイトがリニューアルされていて、

たどり着けませんでした。



一度お試しください。

2018/03/03 16:27

返信 参考になった (1)

2018/03/03 19:42 ババイソン への返信 ババイソン への返信

> 以前 Piyomaru Softwareさんの記事の


私もその記事を以前読みました。com.apple.quarantine が付いてるファイルをドロップすると、スキップされてしまう問題...と記憶してます。本件が該当するかは分かりませんが、試す価値はあるかなと。


ところで do shell script ですが、お示しのコードだとファイル名にシングルコーテーションが含まれている場合に問題が起きます。


ファイル名が「it' a small world.txt」だと文法エラー、「'$(open .)'」だと、open . が実行されてしまいます。open ではなく、削除系コマンドだと大変なことに...。なので、下のように変更すべきです。


do shell script "xattr -d 'com.apple.quarantine' " & quoted form of POSIX path of sel


quoted form of xxx がミソ。詳細は下のリンク先にあります。


Technical Note TN2065: do shell script in AppleScript

https://developer.apple.com/library/content/technotes/tn2065/_index.html


もうちょっとちゃんとやるなら、拡張属性 com.apple.quarantine の存在確認をして...ですが、まあ、try 文でも良いかな。

2018/03/03 19:42

返信 参考になった (2)

2018/03/04 20:35 Hiro.S への返信 Hiro.S への返信

追加情報です。


Piyomaru さんの記事が Wayback Machine にあったので、リンク貼っときます。


com.apple.quarantineがドロップレットに与える影響

https://web.archive.org/web/20171201033244/http://piyocast.com/as/archives/4465


ーーーーー


あと、下記は拡張属性確認用のスクリプトです。使い方は、ダイアログでファイルを選択 (複数選択可) して OK を押すだけ。


on run set args to "" repeat with f in choose file with multiple selections allowed set args to args & quoted form of POSIX path of f & space end repeat try my getxattr(args) on error errs number errn return errs end try end run on getxattr(args) do shell script "bash -s <<'EOF' - " & args & " for f in \"$@\" do echo \"${f##*/}\" xattr \"$f\" jot -s '' -b '-' 50 done EOF" end getxattr

2018/03/04 20:35

返信 参考になった (1)

2018/03/04 21:10 ババイソン への返信 ババイソン への返信

失礼致します。 私の場合、上記の2回のダイアログが表示された.DOCや.workflowのファイルを、xattrコアマンどを使って、拡張属性を調べて見た所、確かに、com.apple.qurantineの拡張属性が付いていました。 なるほどです。 参考になりました。

2018/03/04 21:10

返信 参考になった

2018/03/05 18:54 ks34 への返信 ks34 への返信

なるほど、原因は「com.apple.qurantine」なのですね。


たしかに、記載頂いたスクリプトを実行してみたところ、

新規作成したExcelには、この値が含まれていました。


この拡張属性について、本来であれば、ダウンロードしたファイルなど、由来が不明なファイルを

操作しないように、ということなのだと思います。

発想は理解しますが、、、理由がすぐに分からない、ガイドがない、など

実装としては今ひとつの感じがしますね。。


また、納得できないのは、Excelで新規作成したファイルですら、

この属性がついてしまっていることです。


バグでなくて仕様、ということなので、レポートをあげても解消の見込はなさそうですね。

Dropletは使ってはいけない、と理解しました。。

2018/03/05 18:54

返信 参考になった

2018/03/21 18:05 Hiro.S への返信 Hiro.S への返信

Hiro.S 様 ご指摘ありがとうございます。 quoted form of の記述、おっしゃるとおりでございます。 今回の件につきまして、様々なファイル名を想定しておらず、 ちゃんとできておりませんでした。

2018/03/21 18:05

返信 参考になった

2018/03/21 19:21 ババイソン への返信 ババイソン への返信

もう少し穏やかな表現にすれば良かったと反省してます。直接関係がない部分ですみませんでした。また、拡張属性に関する貴重な情報をありがとうございました。

2018/03/21 19:21

返信 参考になった
ユーザのユーザプロフィール: ks34

質問: AppleScriptのドロップレットの呼び出し回数が不定