Archive for the 'Automator' Category

2015/08/13 Automatorを使ってAppleScriptベースの「サービス」を記述

Automatorについては、最初のバージョンの段階で「検索キーワードに柔軟性がなさすぎ」(日本語のように同義語が多い言語では使いにくい)といったフィードバックをしたものの、とくに改善されずに今日にいたり・・・これを使うよりもScript Editorを起動したほうが手っ取り早いので、1年に一度起動するかしないか・・・といった利用頻度。

同じく、NeXTstepの時代から「これもうちょっとなんとかならないのかな?」と思い続けてきた「サービス」についても、ながらく「有用な用途」が見つけられず(中途半端にアプリを連携させるより、AppleScriptを書いてワークフローすべてを自動化するほうが便利なので)、サービスについてもほとんど使ったことがありませんでした。

オンラインの各種サービスとつないだり、LAN上の他のマシン(上で公開しているサービス)を認識して動的にメニュー表示させたら便利そうだなーと思っていたものの、基本的にはNeXT時代とさほど変わらぬ位置づけで今日にいたります。

たまたまAppleScriptでサービスを書くという話を見かけて、自分用にメモとして残しておきます。

auto1.png
Automatorを起動して、メニューから「ファイル」>「新規」を実行して「サービス」を選択。

auto2.png
とりあえず、Safari上で選択したテキストを受け付けるように設定

auto0.png
アクション「AppleScriptを実行」を選択して、いつもの調子でScriptを記述。useコマンドも使えるし、ASOCも書ける。script文で論理分割したAppleScriptも書けるし、呼び出すことも可能。これを「ASTEST」の名前で保存

auto3.png
Safari上でテキストを選択して・・・

auto4.png
Safariの「サービス」メニューからサービス「ASTEST」を実行

auto5.png
入力データ「input」とパラメータ「parameters」の内容をテキスト化してダイアログ表示してみたところ

inputの内容はリストに入れられたテキストだということが思い出せたので、そのように書けば大丈夫だとわかりました。ただ、たぶんサービスをAutomator上で書くことはほとんどないはず・・・

auto7.png

Safari上に表示された「戦場の絆」のリプレイIDを選択しておくと、リプレイムービーのURLに変換したり、リプレイムービーをダウンロードしたり、リプレイの再生を開始するAppleScriptを作成したので、こういうものを「サービス」に組み込んでおくと何か便利だろうかと思ったのですが、結局Script Menuから実行することになるでしょう、、、

なにげに、実行するScriptのソースコードがまるごと取得できることがわかったので、いろいろ高度な(込み入った)ことができそうな気がいたします。

2011/02/06 指定のAutomator Workflowのファイルを実行する v3

指定のAutomator Workflow(Automator書類)を実行するAppleScriptです。

Mac OS X 10.5の途中のアップデートからAutomator RunnerやAutomator Launcherを通じてAppleScriptからAutomator Workflowを起動することができなくなってしまいました。セキュリティ向上のために取った策が裏目に出たと言われています。

一度、ヘルプビューワーのURLプロトコルがセキュリティホールになったことがあり、その直後からURLプロトコルが徹底的に塞がれて、URLプロトコル経由でアプリケーションのコントロールを行うと、実行が途中で止められたりしました。そのぐらいの時期にAutomator WorkflowのASからの実行がおかしくなった記憶があります。

AppleScriptからAutomatorのWorkflowを呼び出すケースはそれほどありませんが、まったくないわけでもありません(Excel書類にAutomator WorkflowやAppleScriptを埋め込んで実行したりしました。あとよく使うのはPDFの連結)。そこで、Mac OS X 10.6上でAutomator Workflowを呼び出す実験を行い、再利用できるようにルーチンにまとめておきました。

スクリプト名:指定のAutomator Workflowのファイルを実行する v3
set aWorkflow to choose file
set aRes to executeAutomatorWorkflow(aWorkflow) of me

–指定のAutomator Workflowのファイルを実行する
on executeAutomatorWorkflow(aWorkflow)
  set aShell to “/usr/bin/automator “ & (quoted form of POSIX path of aWorkflow)
  
with timeout of 3600 seconds
    try
      set aRes to (do shell script aShell)
    on error errorMes
      return errorMes
    end try
  end timeout
  
  
return aRes
end executeAutomatorWorkflow

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/04/05 指定のAutomator Workflowのファイルを実行する

任意のAutomator WorkflowをAutomator上で実行します。AppleScriptの処理の中でAutomatorのWorkflowを呼び出せると大幅に手抜きができるケースがあります。また、AppleScript側に機能が解放されていないのになぜかAutomator上では使えるようになっている機能を利用したい、といったケースにも役立つことでしょう。

スクリプト名:指定のAutomator Workflowのファイルを実行する
set aWorkflow to choose file
executeAutomatorWorkflow(aWorkflow) of me

指定のAutomator Workflowのファイルを実行する
on executeAutomatorWorkflow(aWorkflow)
  try
    with timeout of 3600 seconds
      using terms from applicationAutomator
        tell applicationAutomator
          close every workflow saving no
          
open aWorkflow
          
tell workflow 1
            execute
          end tell
        end tell
      end using terms from
    end timeout
  on error
    display dialogAutomator Workflow実行時にエラーが発生しましたbuttons {”OK“} default button 1 with icon caution
  end try
end executeAutomatorWorkflow

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

2008/03/09 Automator集計

AppleScriptでプログラムを作るということは、スクリプティング対象となるアプリケーションについて、ひいてはMacのアプリケーション全般に対する情報収集が必要になります。とくに、OSのバージョンが上がった直後は、どのような変更が加わったのかをOS本体のみならず、添付アプリケーションについても調査することになります。中でも、Automatorのアクションがどの程度充実しているか、というのは個人的に大きな関心事なので……このようなプログラムを組んで調査することになります。これは、そういうために作ったAppleScriptです。

スクリプト名:Automator集計
【コメント】 Automatorのターゲットアプリケーション別集計
ただし、1つのActionが複数のターゲットを指定していることもある。

tell applicationAutomator
  set a to target application of every Automator action
end tell

set a_ref to a reference to a

set aList to {}
set aList_ref to a reference to aList

set bList to {}
set bList_ref to a reference to bList

repeat with i in a_ref
  repeat with j in i
    set aGenle to contents of j
    
if aGenle is not in aList_ref then
      set the end of aList to aGenle
      
set the end of bList to 1
    else
      repeat with k from 1 to length of bList_ref
        if contents of item k of aList = aGenle then
          exit repeat
        end if
      end repeat
      
      
set item k of bList_ref to (item k of bList_ref) + 1
    end if
  end repeat
end repeat

set eList to {}
repeat with i from 1 to (length of aList)
  set the end of eList to {item i of aList_ref, item i of bList_ref}
end repeat

eList

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に