homeホームHTMLに役立つヒントガラクタAppleScript > Apple Scriptの覚え書き

Apple Scriptの覚え書き

 MACな人にしか用がありません。アップルスクリプトのヒジョーに限定的な覚え書きと、自分で作ったルーチンなど。早い話、自分用のメモです。わかりにくかったり、間違った記述があったらごめん。


■■ 目次 ■■


●標準の「用語説明」をみたい ▲ページトップ

 スクリプト編集プログラムを自分自身で開かせればいいと思ったんですが、できないんですね。
 どうすればいいのか教えてほしいです。
 システムフォルダの中の「スクリプティング機能追加」の中の「標準機能追加」をドロップするとけっこう解りますが、全部じゃないです。あちこちに分散しているようで、困ってます。やはりリファレンスを買うしかないか?


●ダイアログボックスの特定のボタンをデフォルトにする。 ▲ページトップ

 いろいろお世話になるdisplay dialog。ボタンを複数設定するには「buttons {"キャンセル", "clipboardから取込", "OK"}」なんて具合に記述しますが、これだけだとデフォルトボタンになりません。

 そこで「default button 3」なんて具合に追加してやります。この例では3番目のボタンがデフォルトになります。

 ちなみにdisplay dialogの用語説明は以下の通り(「標準機能追加」から)。
display dialog: Display a dialog box, optionally requesting user input
display dialog
string -- the text to display in dialog box
[default answer string] -- the default editable text
[buttons list] -- a list of up to three button names
[default button number or string] -- the name or number of the default button
[with icon number or string] -- the name or ID of the icon to displayノ
[with icon stop/note/caution] -- ノor one of these system icons
[giving up after integer] -- number of seconds to wait before automatically dismissing dialog
Result: dialog reply -- a record containing the button clicked and text entered (if any)


●前回押したボタンを覚えておく ▲ページトップ

選択ダイアログで、前回押したボタンを覚えておく。

property browser_kind : "" --- 前回選択したブラウザボタン
if browser_kind is "" then set browser_btn to 3 -- 空だったら3に
if browser_kind is "Mozilla" then set browser_btn to 3
if browser_kind is "IE" then set browser_btn to 2

--- ブラウザの選択
--- デフォルトをIEにしたい場合は「default button 3」を「default button 2」にしてください。
display dialog ツ
"URLを開きます。ブラウザは?:" & return ツ
buttons {"キャンセル", "IE", "Mozilla"} ツ
default button browser_btn --- x番目のボタンをデフォルトに
if button returned of result is "IE" then
set
browser to "IE"
else if button returned of result is "Mozilla" then
set
browser to "Mozilla"
else if button returned of result is "キャンセル" then
return
--- 処理中止
end if
set
browser_kind to browser --次回のために


●クリップボードの中身を取得する。 ▲ページトップ

set clipText to clipboard as text なんて具合にやりたいところですが、これだとエラーがでます。

set clipText to (the clipboard) as text てな具合に()で分離しないといけないみたい。

逆にクリップボードに入れるには素直にこんな感じ。

set the clipboard to 変数


●検索・置換はデリミタが速い ▲ページトップ

検索・置換にはデリミタ(区切り文字)を使うと高速にできる。以下はmi用「掲示板入力」モードに搭載した「改行を取る」で作ったスクリプト。

 手順は次の通り。
1. delimitersを検索文字にセットする。
2. delimitersでリストに分解する。
3. delimitersを置換文字にセットする。
4. リストをdelimitersを付けながら元に戻す。
 下のスクリプトでは最初にdelimitersを取っておいて、後で元に戻している。

set zentai to selection -- 選択範囲全体を取得

set lastDelimit to AppleScript's text item delimiters --- デリミタ(区切り文字)をとっておく
set AppleScript's text item delimiters to return --- デリミタ(区切り文字)を改行に

--- デリミタで全体をリストに分解
--- every text item of ○○とするとデリミタでリストに分解される
set zentai to every text item of zentai

set AppleScript's text item delimiters to "" --- デリミタ(区切り文字)を""に

--- 分解したものをデリミタ(実は空文字)を付けながらくっつける
--- ○○ as text とするとデリミタを付けながら一つにまとめて取り出せる
set zentai to text of zentai as text

set AppleScript's text item delimiters to lastDelimit --- デリミタ(区切り文字)を元に戻す

--- 選択部分に書き戻す
copy zentai to selection

変換する箇所がたくさんあると面倒なので、専用のルーチンを作ってみた。
on barasu(myText, newDel, bORt) --1は分解それ以外はつなぐ
set oldDel to AppleScript's text item delimiters --デリミタを保存しておく
set AppleScript's text item delimiters to newDel --渡されたデリミタにする
if bORt = 1 then
set
myText to every text item of myText --1なら分解
else
set
myText to myText as string --それ以外はつなぐ
end if
set
AppleScript's text item delimiters to oldDel --デリミタを元に戻す
return myText
end barasu

 このルーチンを呼び出すときには次のようにする。
set thisText to my barasu(処理したい文字列, " ", 1) --全角スペースで分解
set thisText to my barasu(処理したい文字列, "+", 0) --+でつなぐ(置換する)

で、上のルーチンを改造し、ひたすら置換のためのルーチン。呼び出すときには次のようにする。
set thisText to my replaceTxt("処理したい文字列", "検索文字列", "置換文字列")
on replaceTxt(myText, searchTxt, replaceTxt) --置換専用
set oldDel to AppleScript's text item delimiters --デリミタを保存しておく
set AppleScript's text item delimiters to searchTxt --渡されたサーチワードをデリミタにする
set
myText to every text item of myText --分解して
set AppleScript's text item delimiters to replaceTxt --渡された置換ワードをデリミタにする
set
myText to myText as string --つなぐ
set
AppleScript's text item delimiters to oldDel --デリミタを元に戻す
return myText
end replaceTxt

▲上のルーチンを使って改行コードを変換したりとか。文字列aaaを変換する例。

--まずは改行コードをセットして置いて
set cr to ASCII character(13)--CR
set lf to ASCII character(10)--LF
set crlf to cr & lf--CR+LF

set aaa to my replaceTxt(aaa, cr , lf) --CRをLFに変換/MAC→UNIX
set aaa to my replaceTxt(aaa, lf , cr) --LFをCRに変換/UNIX→MAC
set aaa to my replaceTxt(aaa, crlf , cr) --CR+LFをCRに変換/Windows→MAC


●文字列の中に特定の文字を含むか調べる ▲ページトップ

置換なんかしなくても、ある文字列の中に特定の文字を含むかどうか調べるだけでいいこともある。これはoffsetを使う例。offsetは文字列があれば見つけた位置を返してくる。0ならなかったことになる。

set moji to "bcdefgabc"
set searchWd to "abc"
set kekka to offset in moji of searchWd
display dialog kekka

 これを走らせると、7が返ってくる。abcは7文字目にあるという意味である。

 よって、有無を調べるだけなら、0が返るかその他が返るかで判断すればよい。

set moji to "bcdefgabc"
set searchWd to "abc"
if (offset in moji of searchWd) = 0 then
display dialog "ないよ"
else
display dialog "あったよ"
end if

 こんな感じだ。


●半角カナを全角に変換する ▲ページトップ

田中求之さんのTanaka's OSAXを使う方法。

set aaa to "ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ パ ビ ピ ブ プ ベ ペ ボ ポ ヴ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ッ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ワ ワ ヲ ン 。 「 」 、 ・ ー ゙ ゚"

set bbb to MT Replace aaa search {"ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ワ", "ヲ", "ン", "。", "「", "」", "、", "・", "ー", "゙", "゚"} replace {"ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヲ", "ン", "。", "「", "」", "、", "・", "ー", "゛", "゜"} --半角カナを全角に

display dialog bbb

 が、この方法、ときどき失敗する(;_;)

上の「検索・置換はデリミタが速い」を応用して、専用ルーチンを作ってみた。kanaToZenがカナ変換専用ルーチン。AppleScript 1.83(OS 9)では動作するが、なぜか1.37(OS 8.6)では動作しないことが判明。う〜ん。

set aaa to "ガ ギ グ ゲ ゴ ザ ジ ズ ゼ ゾ ダ ヂ ヅ デ ド バ パ ビ ピ ブ プ ベ ペ ボ ポ ヴ ァ ア ィ イ ゥ ウ ェ エ ォ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ッ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ャ ヤ ュ ユ ョ ヨ ラ リ ル レ ロ ワ ワ ヲ ン 。 「 」 、 ・ ー ゙ ゚"

set bbb to my kanaToZen(aaa) --ルーチンの呼び出し

display dialog bbb

on kanaToZen(thisTxt) --半角カナ変換ルーチン
set hankaku to {"ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ワ", "ワ", "ヲ", "ン", "。", "「", "」", "、", "・", "ー", "゙", "゚"} --変換用リスト
set zenkaku to {"ガ", "ギ", "グ", "ゲ", "ゴ", "ザ", "ジ", "ズ", "ゼ", "ゾ", "ダ", "ヂ", "ヅ", "デ", "ド", "バ", "パ", "ビ", "ピ", "ブ", "プ", "ベ", "ペ", "ボ", "ポ", "ヴ", "ァ", "ア", "ィ", "イ", "ゥ", "ウ", "ェ", "エ", "ォ", "オ", "カ", "キ", "ク", "ケ", "コ", "サ", "シ", "ス", "セ", "ソ", "タ", "チ", "ッ", "ツ", "テ", "ト", "ナ", "ニ", "ヌ", "ネ", "ノ", "ハ", "ヒ", "フ", "ヘ", "ホ", "マ", "ミ", "ム", "メ", "モ", "ャ", "ヤ", "ュ", "ユ", "ョ", "ヨ", "ラ", "リ", "ル", "レ", "ロ", "ヮ", "ワ", "ヲ", "ン", "。", "「", "」", "、", "・", "ー", "゛", "゜"} --変換用リスト

set oldDel to AppleScript's text item delimiters --デリミタを保存しておく
set i to 1
repeat with x in hankaku
set AppleScript's text item delimiters to x --半角カナをデリミタに
set thisTxt to every text item of thisTxt --分解して
set AppleScript's text item delimiters to item i of zenkaku --全角カナをデリミタに
set thisTxt to thisTxt as string --つなぐ
set i to i + 1
end repeat
set
AppleScript's text item delimiters to oldDel --デリミタを元に戻す

return thisTxt
end kanaToZen

 AppleScriptのCGIで使おうと思ったんですが、上記のように低いバージョンのAppleScriptでは動作しませんでした。結局、JAVAscriptで対処しました。ブラウザ側で解決させたってわけです(^^; JAVAscriptの実際は「JAVAスクリプトコレクション」に掲載しています。


●メールアドレスをエンティティ化する ▲ページトップ

 ここでは10進数でエンティティ化しています。これだと古いブラウザでも大丈夫なようなので。あ、変換するのは1バイト文字でないとダメですよ。

set aaa to mailEntiti("mailto:abcdefg@hijk.ne.jp") --エンティティ化したい文字列を渡す
display dialog aaa --結果表示
set the clipboard to aaa as string --OKすると結果がクリップボードへ

on mailEntiti(testWdall) --エンティティ化ルーチン
set entitis to "" --初期化
set x to 1 --初期化
repeat
try
set
testWd to character x of testWdall --1文字取り出す
on error --文字列が終わるとエラーになる
exit repeat
end
try

set
asciiMoji to ASCII number testWd --文字コードに変換
set asciiMoji to "&#" & asciiMoji & ";" --頭に&#、後ろに;をつける。10進数

--16進数でエンティティ化したければ、asciiMojiを16進数に直して、頭に「&#x」、後ろに「;」をつける
set entitis to entitis & asciiMoji
set x to x + 1
end repeat
return
entitis
end mailEntiti


●フォルダの中のリストを得る ▲ページトップ

フォルダの中にあるもののリストを得ます。

set targetFol to "フォルダパス"

set fileList to list folder alias (targetFol) --フォルダの中のファイルリストを得る


●ファイルの読み書き ▲ページトップ

ファイルの読み込み。for accessで読み込み専門で開く。

set targetFile to "Macintosh HD:Desktop Folder:だから"--デスクトップの「だから」というファイル

open for access file targetFile
set txtFile to read file targetFile
close access file targetFile

open for accessはfileのほかにaliasにもアクセスできる。「open for access file ファイルパス」とすると、そのファイルが存在しない場合、ファイルを作成するが、「open for access alias ファイルパス」とすると、ファイルが存在しない場合エラーとなる。以下、ファイルが存在しないときにファイルを作ってほしくなければfileではなくaliasを使うとよい。try〜end tryで囲んでエラー処理するといいだろう。

ファイルの書き込み。with write permissionしながら開くとファイルを書き込み用に開くことになる。ファイルが存在しないと生成する。
open for access file targetFile with write permission --ファイルを開く
write writeData to file targetFile --ファイルに書き込む
close access file targetFile --ファイルを閉じる

 読み書きするルーチン。「set thisText to my readFile(filaName) --文書の読み込み」「my writeFile(filePath,"書き込みファイルデータ")--ファイルの書き込み」のように呼び出す。

--ファイルを読み込む
on readFile(filePath)
--該当ファイルを読み込む
set filePath to filePath as string
open for access file filePath --with write permission --ファイルを開く
set txtData to read file filePath --ファイルを読む
close access file filePath --ファイルを閉じる
return txtData
end readFile

--ファイルにデータを書き込む
on writeFile(filePath, writeData)
open for access file filePath with write permission --ファイルを開く
write writeData to file filePath --ファイルに書き込む
close access file filePath --ファイルを閉じる
end writeFile

 上の例だと、読む方はいいが、書き込むときに上書きになる(完全な上書きではない。abcという中味があるところにdを書き込むと、dbcとなる)。追記するにはこんな感じ。ただし、これも最期の1バイトが追記文字列に置き換わるため、完全な追記ではない。さて、どうしたもんか。
--ファイルにデータを書き込む
on writeFile(filePath, writeData)
open for access file filePath with write permission --ファイルを開く
try
write writeData to file filePath starting at -1 --ファイルに追記する
on error --ファイルがないか、中味がないとエラー
write writeData to file filePath --ファイルに書き出す
end try
close access file filePath --ファイルを閉じる
end writeFile


●時間を得る ▲ページトップ

現在時刻はこれでOK。

set nowTime to current date

--実は計算もできる。300は60秒×5分の意味。つまり5分前の時間になる。
set nowTime to nowTime - 300

ファイルの修正日を得る。
set fileModTime to modification date of file (targetFile)


●Fetchでアップロード ▲ページトップ

まずはサーバに接続して、それからアップロードという手順になる。接続方法には直接接続する方法とFetchのショートカットを呼び出す方法の2つがある。自動アップロードツールを作った時のキモ。

ショートカットを使わない場合。

--nameはftpに入るためのアカウント、*******はパスワード、@以下でURLの指定
set DestUrl to "ftp://name:*******@www.kiwi-us.com/public_html/penguin"

tell application "Fetch 3.0.3J2"
activate
open url (DestUrl as string) --ディレクトリを開く
--トランスファーウインドウに対してputする
put into transfer window 1 item alias (targetFile)
end tell

ショートカットを使う場合。あらかじめFetchでショートカットを作っておく必要がある。

set bookmarkName to "came_news" --ショートカットの名前

tell application "Fetch 3.0.3J2"
activate
tell shortcut window 1
open bookmark bookmarkName
end tell
tell
transfer window 1
put into item alias (onDir & obj as text) text format Raw Data
end
tell
end
tell

ディレクトリを移動するのはちょっと手が込んでいるのだ。

すでにtransfer windowがオープンしていて、その下の「xmls」ディレクトリに移動したい場合。

set transferWind to transfer window 1 --ウインドウをset
set workDir to current directory of transferWind --ディレクトリをセット
--こうしないと移動できないのだった。
set current directory of transferWind to (workDir & "/xmls")

--処理が終わって元のディレクトリに戻りたいなら
set current directory of transferWind to workDir

逆にダウンロードするときはというと、copy〜beginningを使う。バックアップファイルを自動ダウンロードするツールを作ったときのキモ。

すでにtransfer windowがオープンしていて、その下の「xmls」ディレクトリに移動したい場合。

set onDir to "Macintosh HD:Desktop Folder:" --ダウンロードする場所。これはデスクトップ
set obj to "aaa.tar.gz" --ダウンロードするファイルの名前
--でもってダウンロード
copy remote file obj to beginning of alias onDir


●タイムアウト処理 ▲ページトップ

フツーは90秒以内に結果を得られないとエラーで終了するが、それを回避する方法。最大600秒だそうです。

with timeout of 240 seconds

--ここに処理がくる

end timeout


●MacPerlスクリプトを実行 ▲ページトップ

MacPerlで作った複数のスクリプトを連続実行したかったのである。わかってみるとなんのことはない。ここでは1回しか実行していないけど。

set scriptName to "Macintosh HD:Desktop Folder:aaa.pl"

tell application "MacPerl"
activate
--Open scriptFile
Do Script (scriptName) as Text
Close document 1
end tell

連続実行したいなら、最初にスクリプトのリストを変数に格納して、repeatで順番に実行するようにすればよい。

set scriptDir to "Macintosh HD:Desktop Folder:script:" --スクリプトのあるフォルダ

--スクリプトの名前。,区切りで記述
set scriptName to {"aaa.pl", "bbb.pl", "ccc.pl"}

tell application "MacPerl"
activate
repeat with thisName in scriptName
Do Script (scriptDir & thisName) as Text
Close document 1
end repeat
--quit
end tell

AppleScriptからMacPerlスクリプトに変数を渡す場合は次のようにする。mode Batchは結果を返してほしいときにつけるオプション。MacPerl側から返ってきた結果はresultで受け取れる。

MacPerlスクリプト。「testscript」という名前でデスクトップに置く。

# @ARGVで変数を受けとる。
# 受けとった変数を逆にして返す。

$aaa = "@ARGV[2],@ARGV[1],@ARGV[0]";
print $aaa;

exit;

AppleScript。

--スクリプトファイル名。testscript of desktopではダメ。
set Perl_Script to alias "Macintosh HD:Desktop Folder:testscript"

--変数を3つ送り、結果を表示
tell application "MacPerl"
Do Script {Perl_Script, "1番", "2番", "3番"} mode Batch
end tell

display dialog result

上のスクリプトの応用ですが、MacPerlを使って漢字コードをEUCに変換して返すスクリプト。実はこの機能がAppleScript単体で欲しいのだった。

MacPerlスクリプト。「toEUC.pl」という名前で次のAppleScriptと同じフォルダに置く。

# Jcode.pmを使い、受けとった文字列をeucに変換して返す。

use Jcode;

$thistext = @ARGV[0];

#漢字コードの変換。sjisにしたいならsjis、UTF-8にしたいならutf8に
Jcode::convert(\$thistext, 'euc') ;

# さらにURLエンコードしたいなら次の行頭の「#」を外す
#$thistext =~ s/(\W)/'%'.unpack("H2", $1)/ego;

# ちなみにURLデコードなら次のようにする。デコードした後漢字コード変換も場合によって必要。
#$thistext =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/ego;

print $thistext;
exit;

AppleScript。アプリケーションとして「toEUC.pl」と同じフォルダに保存する。アプリにしないとパスの取得に失敗するので注意。名前はなんでも良し。

--スクリプトファイル名。
set scriptName to "toEUC.pl"

--このフォルダのパスを得る
set thisDir to (":" as alias) as string

--変換したい文字列
set clipText to (the clipboard) as text --- クリップボードの中身を取得

display dialog "変換したい文字列は?" default answer clipText
set oljinMoji to text returned of result

--文字列を送り、EUCに変換して結果を表示
tell application "MacPerl"
Do Script {(thisDir & scriptName), oljinMoji} mode Batch
end tell

display dialog result

逆に、MacPerlからAppleScriptを実行するにはこんな感じ。

$toAdress = "自分宛" ;#--UVJ Mailerに登録してある宛先。UVJ Mailer nickname
$mailSubject = "テストメールだよ" ;#--- メールタイトル
$mailFrom = "mizusawa\@kiwi.ne.jp" ;#--- 差出人アドレス
$mailBody = "ここは本文なのだ。\n" ;
$mailBody .= "本当なのだ。"; #--メール本文

&MacPerl'DoAppleScript(<<END_SCRIPT);
tell application "UVJ Mailer 3.0 PPC"

activate
send mail "$mailBody" to "$toAdress" from "$mailFrom" subject "$mailSubject"
end tell
END_SCRIPT

 MacPerlからAppleScript側に変数を渡すときには、"$変数名"のように"で囲んであげないといけない。これにはまってしまった(;_;)


&MacPerl'DoAppleScript(スクリプト名)

 という呼び出し方もある。こちらはあらかじめ保存してあるAppleScriptの呼び出し。

 MacPerlからAppleScriptを呼び出した場合、AppleScriptの処理結果をMacPerlで受けとりたいわけで。これについては僕はあんまりよく判ってないです。

 クリップボードの中味を取得したい場合はこんな感じでできることは判明。同様の方法で結果を渡せるはずだと思いますが、複雑になるとどうなるんだろう。

$clip = &MacPerl'DoAppleScript("(the clipboard) as text");
print "$clip";


 複数行に渡るスクリプトならこんな感じがいいだろう。

$clip = &MacPerl'DoAppleScript(<<END_SCRIPT);
(the clipboard) as text
END_SCRIPT

print "$clip";


●cronもどきを作る ▲ページトップ

一定時間ごとに処理を繰り返す。割と有名というか、他に書きようがないくらい単純なスクリプト。アプリケーションとして保存し、「自動終了しない」をチェックするのがミソ。

property IntervalTime : "120" --- 間隔を分単位でセット。1時間なら60という具合

set IntervalTime to IntervalTime * 60 ---秒に換算

on idle
---ここに処理スクリプトを書く。
---例としてMacPerlを手前にするスクリプト↓
tell application "MacPerl"
activate
end tell

return IntervalTime--次に処理するまでの秒数
end idle


●URLに接続する ▲ページトップ

OS 9依然と以後ではやり方が異なります。次のスクリプトの出典はこちら。下の例はOS 9のもの。open location命令がきも。ただし、この方法ではデフォルトブラウザが開いてしまう。ブラウザを使わずにHTMLの内容を取得する方法を探しているんだけど…。MacPerlならできますけどね

set targetUrl to "http://www1.kiwi-us.com/~mizusawa/penguin/index.html"

display dialog "接続先URLは?" default answer ツ
targetUrl buttons {"Cancel", "Connect"} ツ
default button "Connect"
set theURL to the text returned of the result
open location theURL

ありました。ブラウザを使わずにすむ方法。次のスクリプトはmsearch(検索スクリプト)のインデックスを自動更新するAppleScriptを書いたときに使ったもの。キモは「download indexSite to file tmpFile of desktop replacing yes with progress」の1行。「to ファイル名」ではダメで、「to file ファイル名」にすること。もう一つハマッたのは、ファイル名はパス表記でないといけない点。"Macintosh HD:Desktop Folder:ファイル名"という指定はいいが、「ファイル名 of desktop」はダメ。
--URL Access Scripting(以下UAS)を使った方式。ブラウザを使うよりメモリ的に有利。
--UASではアップロードとダウンロードしかないため、生成した送信データを送りつけた後、必ずその結果画面を
--ダウンロードすることになる。そこで、いったんデスクトップにダウンして、次にそのファイルを削除するようになっている。

try
tell
application "URL Access Scripting"
activate --起動して
set tmpFile to ((path to desktop) as text) & "temporary.html" --一時保存ファイル名
download indexSite to file tmpFile replacing yes with progress --デスクトップにダウンロード
quit --終了する 。
end tell

--一時ファイルの削除
tell application "Finder"
delete file tmpFile --一時ファイルをゴミ箱へ移動
--empty trash --ゴミ箱を空にするなら行頭の「--」を消す。
end tell
on
error errorNum
display dialog errorNum
end try

 次項も参照のこと。


●URL Access Scripting ▲ページトップ

 URL Access Scriptingにはuploadとdownloadの二つのコマンドしかありません。

 URL Access Scriptingでファイルをアップする時の基本的な使い方。相手のサーバはFTPサーバになります。

set filename to "アップするファイルのフルパス。例:Macintosh HD:Desktop:test.txt"
set toUrl to "FTPサーバのアドレス/置きたいディレクトリ/"
set userName to "ログイン名"
set passWd to "ログインパスワード"

set toLogin to "ftp://" & userName & ":" & passWd & "@" & toUrl

tell application "URL Access Scripting"
upload file filename to toLogin replacing yes with progress
end tell

 uploadがFTPなのに対し、downloadの方はhttpのようです。htmlなどの通常のファイルをダウンロードできます。

 formデータを送信する場合にもdownloadを使います。formデータを送信して、その結果表示される画面をダウンロードする、という考え方をします。ちょっと分かりにくいですね。

 下に示した使い方はGETメソッドでformを送信する場合で、POSTメソッドの場合はわかんないっす。つか、POSTメソッドで送信できるのか?

 with progressはダウンロード状況を表示するオプション。

set indexSite to "http://abc.com/〜/aaa.cgi" --送信先のCGIのURL
set formData to "form1=aaa&form2=bbb&form3=ccc" --formデータ

tell application "URL Access Scripting"
set tmpFile to ((path to desktop) as text) & "temporary.html" --一時保存ファイル名
download indexSite to file tmpFile replacing yes form data "?" & formData with progress --結果をダウンロード
end tell


●次のrepeatに移る ▲ページトップ

repeatにはいろんなやり方がありますが、一番困ったのは、repeat中にある条件では何か処理をし、その条件を満たさなければ処理をせずに次のrepeatに移りたい場合です。

 perlならnext(次のループに移る)がありますが、AppleScriptにはないみたいなんです。あるのはlast(ループを抜ける)に相当するexit repeatだけのようです。しかたないのでnextFlgを立てて使っています。

repeat

if ここに次のループに移る条件を書く then
set
nextFlg to 1--次のループに入るフラグ
else
set
nextFlg to 0--このループの処理を続ける
end if

if nextFlg = 0 then
ここにrepeat処理したい内容を書く
end if

end repeat

いろんなrepeatの例。

repeat
--基本形。exit repeatでリピートを抜ける。
end repeat

ある条件を満たしたときにリピートを抜ける場合。

repeat
ここにrepeat処理したい内容を書く

if ここにリピートを抜ける条件を書く then exit repeat

end repeat

repeat with yousoB in listA
--リストlistAの要素を一つずつyousoBに代入しながら処理する。
end repeat
repeat with i from 1 to 100
--1から100まで繰り返す
end repeat
repeat 100 times
--100回繰り返す
end repeat


●自分のパスを知る ▲ページトップ

次の2つのスクリプトは、いずれも「thisDir」にパスが入るはず(ただし、アプリケーションとして保存し、動作させること。スクリプト編集プログラム上で動作させるとスクリプト編集プログラムのパスが入る)。

set thisDir to (":" as alias) as string

set thisDir to (path to me) as text

が、困ったことに、これでもうまくパスを取得できないケースがある。つーか、取得できているはずなのに、うまく動作しないときがあるのだ。原因は不明。その場合はしかたなく力ずくでパスを書くしかない。


●OS XのClassic環境でAppleScriptのアプリケーションを動かす場合、奇妙なことに「set thisDir to (":" as alias) as string」だとハードディスク名までしか取得してくれません。

 「set thisDir to (path to me) as text」とするとアプリケーション名まではいってしまいます。

 しかたないので、path to me方式でアプリケーション名まで取得し、そこからアプリケーション名を削除する、という手法でパスを取り出しています。こんな感じです。
set fileName to "scripaName" --このスクリプトの名前
set thisDir to (path to me) as text
set kekka to offset in thisDir of fileName
set
thisDir to text from character 1 to character (kekka - 1) of thisDir

 これでthisDirにパスがはいります。


●ちょっと待つ ▲ページトップ

いや、全然大したことない命令なのに、わかるまであまりに時間がかかったのでメモしておく。「標準機能追加」をスクリプト編集プログラムで開くとちゃんと書いてあった。それまでカンでwaitとか書いて全然ダメだったのよ。
delay 5 --5とは5秒のこと。これで5秒待ってから次の処理に移る。


●起動中のアプリをチェックする ▲ページトップ

特定のアプリが起動中かどうかチェックする。

set aaa to my openApp("Internet Explorer") --起動中ならaaaに1が入る

if aaa is "1" then
display dialog aaa
else
display dialog "起動してねー"
end if


-- set aaa to my openApp ("アプリ名")で呼び出す。結果が1なら起動中。空なら起動していない。
on
openApp(appName)
set appFlg to "" -- フラグ
tell
application "Finder"
set appList to every process that file type is "APPL" -- that file type is "APPL"を削除するとバックグラウンド専用アプリもチェックする。
repeat with Obj in appList
if (name of Obj as text) is appName then
set appFlg to "1" --
end if
end repeat
end tell
return
appFlg
end openApp

 応用ですけど、起動中のアプリの一覧はこんな感じ。

set appList to "" -- 一覧入れ

tell application "Finder"
set allAppList to every process that file type is "APPL" -- that file type is "APPL"を削除するとバックグラウンド専用アプリも表示する。
repeat with Obj in allAppList
set appList to appList & (name of Obj as text) & return -- 一覧
end repeat
end
tell
display dialog appList


homeホームHTMLに役立つヒントガラクタAppleScript > Apple Scriptの覚え書き