Archive for 3月, 2008

2008/03/29 iPhotoで選択中の写真をデスクトップピクチャに設定

この機能自体はiPhotoの標準コマンドでも用意されているため、AppleScriptから実行する必然性はあまりないのですが、iPhoto上で選択中の写真を対象に何らかの処理を行うための基礎的な実例と思っていただければけっこうです。

スクリプト名:選択中の写真をデスクトップピクチャに設定する
tell applicationiPhoto
  set a to selection
  
  
set anItem to item 1 of a
  
set aClass to class of anItem
  
if aClass is equal to album then return
  
  
set b to properties of anItem
  –
> {dimensions:{1280.0, 960.0}, image filename:”RIMG0095.JPG”, image path:”/Users/maro/Pictures/iPhoto Library/Modified/2007/ロール 33/RIMG0095.JPG”, date:date “2007年 4月 29日 日曜日 2:53:42 PM”, title:”RIMG0095.JPG”, class:photo, height:960.0, thumbnail path:”/Users/maro/Pictures/iPhoto Library/Data/2007/ロール 33/RIMG0095.jpg”, name:”RIMG0095.JPG”, thumbnail filename:”RIMG0095.jpg”, comment:”", width:1280.0, id:4.29496789E+9}
  
set imgPath to image path of anItem
end tell

set imgPathAlias to POSIX file imgPath

tell applicationFinder
  set desktop picture to imgPathAlias
end tell

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

2008/03/29 Finder最前面のWindowをクローン

Finderの最前面のウィンドウで表示中のカレント・ディレクトリをターゲットにしてもう1枚のウィンドウをオープンします。Script Menuに入れて使うことを前提に作成したAppleScript(元は、MLに流れていたもの?)ですが、この手のユーティリティ・タイプのScriptの中では、最も使用頻度の高いものです。知り合いには配って歩いていますが、「なぜ、これがMac OS Xの標準機能ではないのか」と一様に驚くほどに「最初からあってほしい」「あって当たり前」「ないと困る」という存在になっています。

スクリプト名:最前面のWindowをクローン
tell applicationFinder
  set sDisk to (name of startup disk) & “:
  
  
get the exists of the front Finder window
  
if the (exists of the front Finder window) is true then
    try
      set newWindow to target of front window
      
set oldView to current view of front window
      
make new Finder window to newWindow
      
set current view of front window to oldView
    end try
  else
    try
      make new Finder window to alias sDisk
      
set the current view of the front Finder window to column view
    end try
  end if
end tell

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

2008/03/29 Finderの最前面のパスをTerminalで開く(強化ver4)

Finderの最前面のWindowで表示しているパスをTerminalでオープンするというものです。ただし、Finder上のフォルダ名の中には……AppleScriptで処理しようとしただけでクラッシュを誘発するような種類の文字を含んでいるパターンもあるので、それに十分に備えた処理を行うようにしています。

スクリプト名:Finderの最前面のパスをTerminalで開く(強化ver4)
OSバージョンおよびUI Element Scriptingのチェック
tell applicationSystem Events
  get system attributesysv
  
if result is greater than or equal to 4149 then Mac OS X 10.3.5
    if UI elements enabled then
      –    
    else
      display dialogUI Element Scriptingが動作していません。” & return & return & “「システム環境設定」の「ユニバーサルアクセス」で、「補助装置を使用可能にする」のチェックボックスをオンにしてください。with icon stop
      
if button returned of result isOKthen
        tell applicationSystem Preferences
          activate
          
set current pane to panecom.apple.preference.universalaccess
          
return
        end tell
      end if
    end if
  else
    beep
    
display dialogこのコンピュータでは本スクリプトを実行できません。” & return & return & “Mac OS X 10.3.5以降が必要です。with icon caution buttons {”Quit“} default buttonQuit
    
return
  end if
end tell

Terminal.appのウィンドウ表示エンコーディング設定のチェック
set aRes to do shell scriptdefaults read com.apple.terminal StringEncoding
set aRes to aRes as number
if aRes is not equal to 4 then
  display dialogターミナルの文字エンコーディングはUnicodeに設定しておいてください。buttons {”OK“} default button 1
  
return
end if

ここからメイン
tell applicationFinder
  tell Finder window 1
    set a to target
  end tell
  
set aa to a as alias
end tell

set aP to POSIX path of aa
method2(aP) of me

以下、サブルーチン

指定のフォルダをTerminalでOpenする
on method2(aPath)
  
  
set the clipboard tocd
  
  
activate applicationTerminal
  
tell applicationSystem Events
    tell processTerminal
      –先行してコマンドラインに入力されていた内容をキャンセル
      
keystrokeuusing {control down}
      
delay 0.5
      
keystrokevusing {command down}
    end tell
    
delay 0.5
  end tell
  
  
set the clipboard to aPath
  
delay 0.5
  
  –
エスケープテキストをペースト(フルパス一括で)
  
activate applicationTerminal
  
tell applicationSystem Events
    tell processTerminal
      click menu item 5 of menu 1 of menu bar item 4 of menu bar 1
    end tell
    
keystroke return
  end tell
  
  
tell applicationTerminal
    do scriptclearin window 1
  end tell
  
end method2

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

2008/03/29 ターミナルのcurrentをFinderでひらく

Finderの最前面のウィンドウのパスをカレントにしたTerminalをオープンするというScriptはよく見かけるものですが、その逆に……Terminal上のカレント・ディレクトリをFinderでオープンするというAppleScriptです。Script Menuに入れて使っています。

スクリプト名:ターミナルのcurrentをFinderでひらく.scpt
tell applicationTerminal
  do scriptpwdin window 1
  
tell window 1
    set a to contents
  end tell
  
set aList to paragraphs of a
  
set aItm to length of aList
  
  
repeat
    set tmpLine to item aItm of aList
    
if tmpLine is “” then
      set aItm to aItm - 1
    else
      exit repeat
    end if
  end repeat
  
  
set targetDir to item (aItm - 1) of aList
  
  
  
set targetDir to targetDir as Unicode text
  –
do script (”cd ” & targetDir)
end tell

tell applicationFinder
  activate
  
set macOStargetDir to retMacOSpath(targetDir) of me
  (*

  set tmpPath to macOStargetDir as Unicode text
  display dialog tmpPath
  
*)
  
set sDisk to (name of startup disk) & “:
  
try
    make new Finder window to alias sDisk
    
set the current view of the front Finder window to column view
  end try
  
tell window 1
    set target to macOStargetDir
    
  end tell
end tell

on retMacOSpath(aFile)
  set aliasFile to {}
  
set aPath to POSIX file aFile
  
set aPath to aPath as alias
  
set aPath to aPath as string
  
set aPath to aPath as Unicode text
  
set aliasFile to aPath
  
return aliasFile
end retMacOSpath

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

2008/03/28 最前面のOmniOutliner書類をDHTMLでデスクトップにExport

Script Menuに入れて使ったり、定期的に書き出してWebにアップロードするような用途のために作成しました。

スクリプト名:DHTMLでデスクトップにExport
set aDesk to path to desktop
set aDeskPos to (POSIX path of aDesk) as string

tell applicationOmniOutliner Professional
  set dCount to count every document
  
if dCount = 0 then return
  
tell document 1
    set aName to name
  end tell
end tell

set aDeskPos to aDeskPos & aName as Unicode text

set exportType to-//W3C//DTD HTML 4.01 Transitional//ENas Unicode text

tell applicationOmniOutliner Professional
  tell document 1
    export to aDeskPos as exportType
  end tell
end tell

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

2008/03/28 クリップボード中のテキストから、行単位にトピック作成

コピーしてクリップボードに入れておいたテキストをもとにOmni Outliner上に行を作成します。

スクリプト名:クリップボード中のテキストから、行単位にトピック作成
set aclipText to the clipboard
set aProp to class of aclipText
if aProp is not equal to Unicode text then
  display dialog選択内容がテキストではないので、Outlinerへの転送処理を行えません。buttons {”OK“} default button 1 with icon note
  
return
end if

if aclipText = “” then
  display dialogクリップボードに何もコピーされていないので、Outlinerへの転送処理を行えません。buttons {”OK“} default button 1 with icon note
  
return
end if

tell applicationOmniOutliner Professional
  set docCount to count every document
end tell
if docCount = 0 then
  display dialogOutlinerで何も書類がオープンされていないため、転送処理を行えません。buttons {”OK“} default button 1 with icon note
  
return
end if

set pList to paragraphs of aclipText
repeat with i in pList
  set j to contents of i
  
makeNewRowOnOutliner(j) of me
end repeat

Outlinerの最前面のドキュメントに対して、新規行を作成
on makeNewRowOnOutliner(aText)
  using terms from applicationOmniOutliner Professional
    tell applicationOmniOutliner Professional
      make with properties {topic:aText} new row at end of document 1
    end tell
  end using terms from
end makeNewRowOnOutliner

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

2008/03/28 Omni Outlinerでドキュメントの全行削除

最前面のドキュメントのすべての行を削除します。

スクリプト名:全行削除
tell applicationOmniOutliner Professional
  tell document 1
    delete every row
  end tell
end tell

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

2008/03/28 1月分のワークログ作成(iCal連携Ver)

ワークログ作成3部作の最終バージョンです。結局、カレンダーどおりに休めるわけでもなく、休みの情報はiCal上に休日カレンダーを作成していたので、それを参照してワークログを作ってくれるようにしたのがこのバージョンです。かといって、それほど時間をかけて作ったわけでもなく……実に効率よく作成できました。

iCalに各日の休み情報を問い合わせると、たとえば31日ある月であれば31回iCalにリクエストを投げる必要があるわけで、アプリケーションへの問い合わせオーバーヘッドを考えるとあまり得策とはいえません。AppleScriptそのものの処理速度はそんなに遅くはないのですが、アプリケーションとの通信を行うとずいぶん待たされます。そのため、本Scriptでは1か月分をまるごと問い合わせて、31回問い合わせるべきところを1回で済ませています。そのことで、初期試作バージョンよりも大幅に処理速度を向上させた次第です。

(more…)

2008/03/28 1月分のワークログ作成(祝日反映版)

ワークログ作成Scriptを作ったものの、土日を除外するようにしか作っていなかったので、祝日のある月には若干手作業を行う必要が出てきました。そこで、国民の祝日を求めるルーチンを突っ込んで、自前ですべてカレンダー計算を行ってワークログを作成するAppleScriptに仕立ててみました。前のバージョンよりもいい感じになりました。
(more…)

2008/03/28 1月分のワークログ作成

OmniOutliner Proをコントロールして、1か月分のワークログ書類を作成します。実行前には、OmniOutliner Proでブランクの書類を作っておく必要があります。毎月、仕事の内容をメモしておくために作ったAppleScriptです。アウトラインプロセッサがAppleScriptからコントロールできると、仕事の効率を思いっきり高められます。本スクリプトも実行するとあっという間にワークログを作成してくれます。Script Menuに入れて呼び出すようにしておくとさらに便利です。

omni1.jpeg

(more…)

2008/03/25 指定の文字エンコーディングでファイル書き出し

AppleScriptでは歴史的に明示的にテキストのエンコーディングを指定する機能が乏しく、日本語環境ではそれなりの苦労があります(過去形で言えないところが辛い)。AppleScriptは内部的にはUnicodeでデータを扱っており……Unicodeとひとことにいっても、具体的には「UTF-16BE」だったりするので(しかも、Intel Mac上でもBE=Big Endian)、BSDレイヤーにある文字コード変換ツール「iconv」の変換元文字コード指定も「UTF-16BE」を指定する必要があります。

かくして、文字コードを指定してファイル書き出しを行うサブルーチンはこんな感じになります。AppleScriptで処理したデータをHTML書き出し(文字コードが決められているケース)する場合などに使います。使用頻度はそれほど高くない(HTML書き出し時にUTF-8を指定すれば足りるケースが多いので)ものの、いざという時に役立ちます。
(more…)

2008/03/22 ファイルの各種情報を取得する

保存したことさえないレベルの、正真正銘「作り捨てレベル」のScriptですが、それだけ重要性が高いものです。さきほどのファイルタイプに応じて処理……といっても、それをどうやって調べるのかといえば、AppleScriptを書いて調べるのが一番手っ取り早く、こんなScriptを書いています。
(more…)

2008/03/22 指定フォルダ内で、ファイルタイプが指定のもので、ファイル名がAlphabet & Numericだけで構成されているファイルを返す

指定フォルダ内の指定ファイルタイプの書類のみを抽出し、さらにファイル名に半角Alphabetと半角記号、半角数字のみから構成されているものを返します。このサンプルではEPSファイルを抽出するようになっています。素材データと一緒に指示書などのドキュメントが一緒に入っている場合があり、指示書(たぶんテキストファイル)のドキュメントをスキップしつつ素材のみを処理対象にする、といった場合に使っています。
(more…)

2008/03/21 メール送信

メール送信はAppleScriptによる自動化で、ぜひとも会得しておきたい技術のひとつです。24時間動き続けているシステムで、エラー発生時に画面のスナップショットを撮ってメールに添付して送信するといった用途や、特定のSubjectのメールが送られたらプログラムを実行し、結果をメールで返信するといった用途が考えられます。

遠隔地に設置したシステムをメールでコントロールするというのは、実用性が高いばかりでなく、なかなか楽しいものです。

スクリプト名:メール送信
set aSubject toメールのサブジェクトです
set theSender tosender@any_address” –送信者アドレス
set recipientAddr tosomebody@mail_reciever” –受信者アドレス
set bodyText toひよこさんへ
こんにちは。ひよこさん。
ひよこクラブへのおさそいです。

ぴよ〜

sendMail(aSubject, theSender, recipientAddr, bodyText) of me

Mail.appでメール送信を行う
on sendMail(theSubject, theSender, recipientAddr, bodyText)
  tell applicationMail
    set newMessage to make new outgoing message with properties {subject:theSubject, content:bodyText}
    
tell newMessage
      set visible to true
      
set sender to theSender
      
make new to recipient at end of to recipients with properties {address:recipientAddr}
      
send
    end tell
  end tell
end sendMail

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

2008/03/19 インターネット接続確認

実行中のマシンがインターネットにつながっているかを調べます。

スクリプト名:インターネット接続確認.scpt
set a to connection_check()

on connection_check()
  try
    tell applicationSystem Events
      do shell scriptsbin/ping -c 1 www.google.com
    end tell
    
set the connection_status to true
  on error
    set the connection_status to false
  end try
  
return connection_status
end connection_check

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

2008/03/19 list sort

入れ子構造になっているリストをソートするためのサブルーチンです。{{item1-1,item1-2}, {item2-1,item2-2},…..{itemZ-1,itemZ-2}}といった構造のリストを、指定のアイテムをキーとしてソートするものです。
(more…)

2008/03/19 リストのCSV書き出し

リスト型変数をCSVファイルに書き出すサブルーチンです。ただし、このルーチンではデータ中に含まれたダブルクォートをエスケープする「サニタイズ」の処理を含んでいません。
(more…)

2008/03/19 文字列の長さでソートする

文字列で構成されたリストを、各文字列の長さに着目してソートするサブルーチンです。
(more…)

2008/03/18 画面のサイズを取得するらしい

トリッキーな画面サイズ取得方法です。

スクリプト名:画面のサイズを取得するらしい
tell applicationSystem Eventsto set {rightLimit, bottomLimit} to size of scroll area 1 in processFinder

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

2008/03/18 指定文字列を指定バイト数以内に収める

指定文字列を指定バイト数以内に収まるように短くします。ただ、Mac OS X 10.5上では(AppleScriptの内部処理コードが完全にUnicodeになったため)正しい結果を返さないはずです。

スクリプト名:指定文字列を指定バイト数以内に収める

set aText to高k甲o子u園Koshien
set aRes to trimTextInByte(aText, 7) of me

指定文字列を指定バイト数以内に収める
on trimTextInByte(aText, aByte)
  set aText to aText as stringSJISで処理するので、Unicodeの2バイト以上の文字のことは気にしない
  
  
set aList to characters of aText
  
  
set dtPath to (path to temporary items folder from user domain) as string
  
set outPath to dtPath & “.strtemp.txt
  
set inPath to POSIX path of outPath
  
  –
文字のバイト数テーブルを作成する
  
set lenList to {}
  
repeat with i in aList
    set j to contents of i
    
write_to_file(j, outPath, false)
    
set hexT to do shell scripthexdump ” & quoted form of inPath
    
set pList to paragraphs of hexT
    
set lastNumText to (last item of pList) as number
    
set the end of lenList to lastNumText
  end repeat
  
  –
文字列の切り捨て処理
  
set loopCount to 1
  
set totalByte to 0
  
set hitF to false
  
repeat with i in lenList
    set totalByte to totalByte + i
    
if totalByte = aByte then
      set resText to items 1 thru loopCount of aList
      
set resText to resText as string
      
set hitF to true
      
exit repeat
    else if totalByte > aByte then
      set resText to items 1 thru (loopCount - 1) of aList
      
set resText to resText as string
      
set hitF to true
      
exit repeat
    end if
    
set loopCount to loopCount + 1
  end repeat
  
if hitF = false then return “”
  
  
return resText
  
end trimTextInByte

on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file

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

2008/03/18 今日の日付をYYYYMMDDで求める

現在日時はcurrent dateで求められますが、これをYYYYMMDDの形式に加工するのはけっこう面倒なので、shellのdateコマンドを呼び出して取得するケースのほうが実用的です。

スクリプト名:今日の日付をYYYYMMDDで求める
set todayStr to do shell scriptdate +%Y%m%d

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

2008/03/18 ABS(絶対値)を求める

AppleScriptにはABS(絶対値)を求める関数は標準では装備されていません。スクリプティング機能拡張(OSAX)でABS関数を提供しているものもありますが、OSAXに頼らなくてもABS程度ならこのぐらいで求められます。

スクリプト名:ABSを求める
set x to -44
set x to absNum(x)
> 44

on absNum(q)
  if q is less than 0 then set q to -q
  
return q
end absNum

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

2008/03/18 10.4.9〜10.4.11でバージョンが10.4.9と返ってくるバグを回避するOSバージョンの取得方法

Mac OS X 10.4.9から10.4.11まで、普通にsystem attribute “sysv”を実行してシステムのバージョンを取得しても、「10.4.9」と返ってきます(バグ)。これを回避するためのOSバージョンチェック方法がAppleScript Users MLに出回っていました。Appleが作るバグを回避するためには、ひたすら情報収集しかありません。

スクリプト名:10.4.9〜10.4.11でバージョンが10.4.9と返ってくるバグを回避するOSバージョンの取得方法
(*

sysv and OS X 10.4.10 and .11

Is it possible in AS to determine if the user is in OS X 10.4.10 or .11?
system attribute “sysv” gives 4169 (hex 1049) for both of these (same as for 10.4.9).

*)

set aVer to (system info)’s system version
set bVer to do shell scriptsw_vers -productVersion

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

2008/03/18 entire contentsをalias listで取得する

指定フォルダの内容をaliasのリストで取得します。
(more…)

2008/03/18 データのhexダンプ_v2

文字データのhexダンプを行うルーチンです。PPC MacとIntel Macではダンプ出力時のバイトオーダーが異なるので、CPUアーキテクチャを検出してそれぞれのケースに対応しています。

# OS X 10.10で動かず

スクリプト名:データのhexダンプ_v2
set aData to text returned of (display dialog “input some keyword to dump” default answer “”)
set aData to1234㍿
set bData to hexDumpStr(aData) of me
bData
> “31323334337f”

set bLen to (length of bData) / 2

データの16進ダンプ(PPC/Intel対応)
高速化した
on hexDumpStr(aData)
  –バイトオーダーを取得(1234でIntel系、4321でPPC系)
  
set byteOrder to do shell scriptsysctl -n hw.byteorder
  
  –
データの書き出し準備
  
set tmpPath to path to temporary items from user domain
  
set inData to (tmpPath as string) & “.hexdumpData.txt
  
set inDataPosix to quoted form of POSIX path of inData
  
  
set aData to aData as Unicode text
  
set cList to characters of aData
  
  
set hexData to “”
  
  
write_to_file(aData, inData, false) of me
  
  
try
    set aRes to do shell scripthexdump ” & inDataPosix
  on error
    return “”
  end try
  
  
set aaList to paragraphs of aRes
  
copy items 1 thru -2 of aaList to bList
  
  
set hexText to “”
  
repeat with i in bList
    set j to contents of i
    
    
set aLine to text 9 thru -1 of j
    
set aWordsList to words of aLine
    
    
repeat with ii in aWordsList
      set jj to contents of ii
      
      
set firstByte to text 1 thru 2 of jj
      
set secondByte to text 3 thru 4 of jj
      
      
if byteOrder = “4321then
        –PPC (Big Endian)
        
if firstByte = “00then set firstByte to “”
        
set byteT to firstByte & secondByte
      else if byteOrder = “1234then
        –Intel (Little Endian )
        
if secondByte = “00then set secondByte to “”
        
set byteT to secondByte & firstByte
      end if
      
      
set hexData to hexData & byteT
      
    end repeat
  end repeat
  
  
return hexData
  
end hexDumpStr

ファイルの追記ルーチン「write_to_file」
追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file

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

2008/03/18 set the beginning of

リスト型変数に要素を追加する場合には、単純に「&」で結合するよりも「set the end of リスト to 要素」にした方が圧倒的に高速なため、set the end ofで後ろに結合するケースが多いのですが、前方に追加する(set the beginning of)ことも可能です。ただし、後方に追加した方が倍ぐらい高速です。→ 実験レポート
(more…)

2008/03/18 指定桁でゼロパディングしたファイル名を返す

数値を指定して4桁にゼロパディングしたファイル名を返します。とりあえず拡張子「.jpg」を付けていますが、それはそういう用途に使ったためです(高速富士山とか)。

スクリプト名:makeFN
set aNum to 50
set aRes to makeFN(aNum) of me
> “0050.jpg”

on makeFN(aNum)
  set aText to0000” & (aNum as text)
  
set aLen to length of aText
  
set aRes to text (aLen - 3) thru -1 of aText
  
return aRes & “.jpg
end makeFN

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

2008/03/18 System UI Soundが有効になっているかどうかをチェック

「システム環境設定」の「サウンド」にある「ユーザーインタフェースのサウンドエフェクトを再生」が有効になっていればtrueを返します。何に使うのかといわれるとすぐには思いつきませんが、こうした地道な情報収集作業がいつか実を結ぶのです、たぶん。

# OS X 10.10で動かず

スクリプト名:System UI Soundが有効になっているかどうかをチェック
getEnableUISound() of me

System UI Soundが有効になっているかどうかをチェック
on getEnableUISound()
  set a to do shell scriptdefaults -currentHost read ‘Apple Global Domain’ ‘com.apple.sound.uiaudio.enabled’
  
return (a = “1“)
end getEnableUISound

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

2008/03/18 指定キーワードの出現回数のカウント

本来、指定のデリミタ(区切り文字)で区切ってリストにするサブルーチンなのですが、それを本来以外の用途に使ってみたものが本サブルーチンです。対象文字列中に指定文字が何回出現するかを計算してくれます。AppleScript’s text item delimiterを使って処理しているので高速です。

スクリプト名:指定キーワードの出現回数のカウント
set origText toこのテキストはいずれ何らかの指定キーワードが何回出現するかという見地から評価される運命にある。評価されるということは、何がしかの文法的評価体系によって分析されるということである(すんごい、いいかげんな日本語)。
set aKeyText to
set freqNum to retFrequency(origText, aKeyText) of me

指定文字列内の指定キーワードの出現回数を取得する
on retFrequency(origText, aKeyText)
  set aRes to parseByDelim(origText, aKeyText) of me
  
return ((count every item of aRes) - 1)
end retFrequency

on parseByDelim(aData, aDelim)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to aDelim
  
set dList to text items of aData
  
set AppleScript’s text item delimiters to curDelim
  
return dList
end parseByDelim

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

2008/03/18 Safariの最前面のウィンドウのタイトルとURLをコピー

Safariの最前面のウィンドウに表示されているページのタイトルとURLをクリップボードに入れます。Web上で調べものをして、サイトの情報をエディタ上にコピー&ペーストしておきたいといった時に、その場で即興で作ったものです。Script Menuに入れて使っています。取るに足らない「作り捨て」レベルのScriptですが、意外と便利です。

スクリプト名:最前面のウィンドウのタイトルとURLをコピー
tell applicationSafari
  set docCount to count every document
  
if docCount = 0 then
    display dialogウィンドウがオープンされていません
    
return
  end if
  
  
set aURL to URL of document 1
  
set a to do JavaScriptdocument.titlein document 1
end tell

set the clipboard to a & return & aURL

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