Archive for 4月, 2009

2009/04/29 Diary++Xで選択中の記事のプロパティを取得する

日記ソフト「Diary++X」で選択中の記事のプロパティを取得するAppleScriptです。

diary1.jpg

同ソフトは、AppleScript対応機能を重視し、プラグインとしてメニューからAppleScriptを呼び出せるようになっているほか、AppleScript記述のドキュメントを同梱。ドキュメントを読むことでScriptingが円滑に行えるようになっています。

……ただし、同ドキュメントを読まないかぎりDiari++Xの特殊な構造について知ることはできず、きわめてクセの強いソフトであると言うことも可能です。

主にarticleに対してアクセスすることになり、フィルタ参照なども使えるのですが、本文(contents)にアクセスする際にGUI側から変更されないようGUIとの排他制御を行う「open text contents」「close text contents」をわざわざアクセスの前後に実行しなくてはならないというのはダメすぎです(そんなダメな実装は世界広しといえどもこのソフトだけです)。

また、AppleScriptから日記やメモのフォルダ階層構造などにもアクセスしたくなりますが、その方面のオブジェクトは何も実装されていません。

スクリプト名:Diary++Xで選択中の記事のプロパティを取得する
tell application Diary++X
  tell document 1
    tell current article
      properties
    end tell
  end tell
end tell
> {label:0, text contents:”てすとの日記”, edited:true, id:”D 2009-04-29 2″, date created:missing value, name:”2009年4月29日水曜日 2″, selected text:”", dated:true, page:2, chapter name:missing value, class:article, title:”てすとだよ”, keywords:{}, diary date:date “2009年 4月 29日 水曜日 0:00:00 AM”, date modified:missing value}

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

2009/04/29 テキストエディットで文字数をカウントする

テキストエディットの最前面の文章内の文字数をカウントして知らせるAppleScriptです。

ted1.jpg

スクリプトメニューにでも入れておいて呼び出すと便利でしょう。テキストエディットはOS標準装備のテキストエディタとしては異様に高機能であり、文字コードがどーのこーのと騒がないかぎりはたいていの用事が済んでしまうほどです。

ただ、自己紹介文を200〜240文字で……などと言われたときに、そういう気の利いた機能はありません。

テキストエディット上の文章をスクリプトエディタに貼り込んでlengthを求めるようなことは……自分はよくやりますが、それを身の回りのMacユーザーに強制するのもかわいそうなので、その場でささっと作ってみました。

スクリプト名:TextEditで文字数をカウントする
tell application TextEdit
  tell text of document 1
    set textList to characters of every attribute run
  end tell
  
  
set textAll to textList as string
  
set tLen to length of textAll
  
display dialog (tLen as string) & 文字です with title この文章の文字数は… buttons {”OK“} default button 1 with icon 1
end tell

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

2009/04/29 Xcodeで表示中のファイルの指定行を表示状態に

Xcode 3.1.2で、表示中のテキスト系ファイルの指定行にカーソルを移動して表示するAppleScriptです。

xcode1.jpg
▲Xcode 3.1.2でAppleScript Studioのプロジェクトをオープンしている状態。Xcode 3.1以降で採用された「ネスティング部分の折りたたみ機能」が特徴

xcode2.jpg
▲本AppleScriptをスクリプトエディタやスクリプトメニューから実行すると、指定行(100行)が表示状態になる

USのAppleScript Users MLにAppleの技術者が投稿したScriptを元にしていますが、クセが強かったのでクセをなくして読みやすく書き直したものです。

実際に、指定行を固定で指定することなどはほとんどなく、Xcode上のプログラムソースコードの内容を外部からアクセスして解析し、必要な部分の行数を動的に計算して求め、その結果の行をフォーカス表示するためにこのようなAppleScriptが必要になるものと思われます。おそらく、XcodeのプラグインをAppleScriptで開発しているユーザーがMLにその方法を質問したものでしょう。

余談になりますが……AppleScriptを読みやすく書くためには、いろいろと国際的な「暗黙のルール」が存在します。

具体的にいえば、極力「it」や「the」を使用しないとか、複数行間で「the result」による値の間接受け渡しを行わず明示的に実行結果を変数に代入するとか、フィルタ参照時に「that」ではなく「whose」を使うなどといったものです。

ほかにも、変数名やサブルーチン名称の大文字小文字のかき分けにも国際的な暗黙のルールが存在し、それに則ることで海外のScripterとの間でスムースな意思疎通が行えるようになります。

スクリプト名:Xcodeで表示中のファイルの指定行数を表示状態に
tell application Xcode
  tell front text document
    set selection to paragraph 100 100行目が選択状態になる
  end tell
end tell

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

2009/04/23 Localeを取得する

現在実行中のユーザー環境の言語(Locale)を取得するAppleScriptです。

スクリプト名:Localeを取得する
set aLocale to getLocale() of me

Localeを取得する
on getLocale()
  set X to “”
  
try
    set X to system attribute LANG
    
if X = “” then set X to do shell script defaults read -g AppleLocale
  end try
  
if X = “” then set X to en
  
return X
end getLocale

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

2009/04/20 現在日時から曜日を番号で返す

dateオブジェクトから、曜日(weekday)を番号で返すAppleScriptです。weekday of X as numberで1行でも済むところですが、丁寧に処理しています。日本語以外の言語環境でも問題なく動作するはずです。

スクリプト名:現在日時から曜日を番号で返す
set aDate to current date
set aWeekDayNum to getDay(aDate) of me
> 2

現在日時から曜日を番号で返す(日曜日:1、土曜日:7)
on getDay(aDate)
  パラメータ判定部分
  
if aDate is “” then
    ヌルの場合には本日の日付を指定
    
set aDate to current date
  else if class of aDate is not date then
    try
      パラメータがDate型でなければ、castする
      
set aDate to date aDate
    on error number errNo
      型変換に失敗した場合にはエラーを返す
      
error errNo
    end try
  end if
  
  
set b to weekday of aDate as number
  
return b
end getDay

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

2009/04/20 リスト中から重複項目をリストアップする

リスト中の重複項目を抽出して出力するAppleScriptです。

スクリプト名:リスト中から重複項目をリストアップする
set bList to {1, 2, 3, 4, 5, 5, 6, 3}
set dupList to detectDuplicates(bList) of me
> {3, 5}

リスト中から重複項目をリストアップする
on detectDuplicates(aList)
  set aCount to length of aList
  
  
set duplicationList to {}
  
repeat aCount times
    set anItem to contents of (first item of aList)
    
set aList to rest of aList
    
if anItem is in aList then
      set the end of duplicationList to anItem
    end if
  end repeat
  
  
return duplicationList
end detectDuplicates

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

2009/04/20 国民の祝日を求めるv2

2009/04/15 MacJournalで任意のjournalをロックする(未遂)

MacJournal 5で、任意のjournalをロックするAppleScriptです……が、辞書に用語が記載されているものの、実際に書いてみると動きません(汗) 構文確認(コンパイル)までは行えるのですが、実行するとエラーになります。

MacJournalMacJournalであるかぎり、このへんのAppleScript系の機能が甘いのは直らないかもしれません(ーー;; もう少しまともになると、ずいぶん使えるのですが……いっそ、この程度ならAppleScript Studioで自分で作ってしまおうかと(汗)

スクリプト名:MacJournalで任意のjournalをロックする(未遂)
tell application "MacJournal"
  tell document 1
    set aSel to choose journal "ロックするJournalを選択"
    
tell aSel
      lock エラーになる!!
    end tell
  end tell
end tell

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

2009/04/15 MacJournalで選択中のjournal entryをricher textに変換

MacJournal 5で、選択中のjournal entryを(プレーンテキストから)リッチテキストに変換するAppleScriptです。

mj532.jpg
▲変換前(プレーンテキスト)

mj540.jpg
▲変換後(リッチテキスト)

……実際には、データ内容は変わらず、プレーンテキストに対してデフォルト指定したフォントから、リッチテキストに対してデフォルト指定したフォントに表示が変わるだけです。

スクリプト名:MacJournalで選択中のjournal entryをricher textに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to richer text
      
一度スタイルつきテキストのエントリをplain textにして、
      
再度richer textに変更しても……書式が元に戻るわけではない
    end tell
  end tell
end tell

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

2009/04/15 MacJournalで選択中のjournal entryをプレーンテキストに変換

MacJournal 5で、選択中のjournal entryをリッチテキストからプレーンテキストに変換するAppleScriptです。

mj530.jpg
▲変換前(リッチテキスト)

mj531.jpg
▲変換後(プレーンテキスト)

ただし、一度実行してしまうとメニューからアンドゥを実行しても元に戻りません。

スクリプト名:MacJournalで選択中のjournal entryをプレーンテキストに変換
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
tell aSel
      set a to convert to plain text
      
GUIからUndoを実行しても変換前の状態に復帰できないので注意!!
    end tell
  end tell
end tell

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

2009/04/14 MacJournalでjournalを選択UIを表示しつつ表示

MacJournal 5で、選択UIを表示しつつjournalを選択するAppleScriptです。

mj520.jpg

スクリプト名:MacJournalでjournalを選択UIを表示しつつ表示
tell application "MacJournal"
  tell document 1
    set anEntry to choose journal with prompt "なんかjournalをえらんでね"
    
> journal 1 of journal 2 of journal 1 of application "MacJournal"
  end tell
end tell

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

2009/04/14 MacJournalでjournal entryを選択UIを表示しつつ選択

MacJournal 5で、choose fileのようにjournal entryを選択する専用UIを表示するAppleScriptです。

mj510.jpg

UIの仕様で、複数のjournal entryを一度に選択することはできません。

スクリプト名:MacJournalでjournal entryを選択UIを表示しつつ選択
tell application MacJournal
  tell document 1
    set anEntry to choose entry with prompt どれかjournal entryをえらんでね
    
> journal entry 2 of journal 2 of journal 1 of application “MacJournal”
  end tell
end tell

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

2009/04/14 MacJournalで選択中のjournal entryを取得する

MacJournal 5の鬼門、選択部分の取得を行うAppleScriptです。

MacJournal 5では、selectionで選択されているオブジェクトを取得できないようになっており、selected entryでアクセスする必要があることを知っておく必要があります。

さらに、選択中のJournalを取得できるわけではありませんし、選択中のjournal entryのparentを取得してJournalを取得することもできません。

また、表示中のjournal entryの本文中の選択部分を取得する、とかいった「よくありがちな」処理はできません。このあたり、いまひとつ作者のDan SchimpfがAppleScriptによるスクリプティングを理解していないのではないかと邪推してしまいます。

作者のDan Schimpfはいいやつなので、メールを出して指摘すると直るかもしれません。ただ、直すべき箇所が多すぎて、どこから指摘してよいのか分らないというのが困りものです。

スクリプト名:MacJournalで選択中のjournal entryを取得する
tell application MacJournal
  tell document 1
    set aSel to selected entry
    
> journal entry 2 of journal 9 of journal 2 of journal 1 of application “MacJournal”
    
リストではなく、裸でオブジェクトが返ってくる(リストに入ってこない)
    
    
複数のオブジェクト(journal entry)が選択されている場合にはmissing valueが返ってくるが、この実装は間違い
  end tell
end tell

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

2009/04/14 MacJournalでキーワード検索状態を解除

MacJournal 5で、「search for」コマンドによるキーワード検索モードに入ってしまった状態から復帰するAppleScriptです。これもあまりAppleScriptっぽい挙動ではありませんが、まあないよりはよいでしょう。

スクリプト名:MacJournalでキーワード検索状態を解除
tell application MacJournal
  tell document 1
    end search
  end tell
end tell

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

2009/04/14 MacJournalで指定のキーワードによる検索

MacJournal 5で、指定キーワードによる全文検索を行うAppleScriptです。ただし、GUIのウィンドウ上からキーワードを入力したのとまるっきり同じであり、AppleScriptっぽい挙動(検索でヒットした結果journal entryがリストで返ってくる)を行うわけではありません。

mj53.jpg

mj52.jpg

スクリプト名:MacJournalで指定のキーワードによる検索
tell application MacJournal
  tell document 1
    search for ぴよまるソフトウェア
  end tell
end tell

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

2009/04/14 MacJournalでjournal entryをexportできない

MacJournal 5にはexportコマンドが用意されているのですが、どうやってもこれは利用できませんでした。バグと思われます(v5.1.3)。

スクリプト名:MacJournalでjournal entryをexportできない
set dtPath to (path to desktop folder) as string

tell application MacJournal
  tell document 1
    tell journal 1
      tell journal プログラミング
        set jList to every journal entry
        
set fCount to 1
        
repeat with i in jList
          set j to contents of i
          
export j as plain text to (dtPath & exportedJ & (fCount as string) & .html“)
          
export {j} as plain text to (dtPath & “exportedJ” & (fCount as string) & “.html”)
          
htmlでもritch textでも、他の形式でもexportできない
          
exportする対象を裸で渡しても、リストで渡してもダメ
          
set fCount to fCount + 1
        end repeat
      end tell
    end tell
  end tell
end tell

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

2009/04/14 MacJournalでjournalの階層をたどる

MacJournal 5でjournalの階層をたどるAppleScriptの記述例です。階層をたどっていくときに、オブジェクトの階層(journal)を順次もぐっていかなくてはならず、Mail.appのように複数階層を一気に指定するような記述ができないので、なかなか大変です。

mj51.jpg

すべてのjournalの階層をたどるためには、再帰処理でも書かないとダメかもしれません。処理時間もかなりかかりそうです。

スクリプト名:MacJournalでjournalの階層をたどる
tell application MacJournal
  tell document 1
    set n1List to name of every journal
    
> {”個人”, “会社関連”, “UNIX系アプリ”, “for DEMO”}
    
tell journal 1
      set n2List to name of every journal
      
> {”個人の活動”, “プログラミング”, “アプリケーション”, “周辺機器”, “Windowsアプリ”, “業界動向”, “私的な内容”, “戦略的な内容”, “DVD,映画”, “PiyoCast”, “家庭用グッズ”}
      
tell journal プログラミング
        set n3List to name of every journal
        
> {”REALbasic”, “Dylan”, “iPhone/iPod touchアプリケーション開発”, “インストーラ”, “アイコンデザイン”, “yuma”, “ruby”, “iTunes”, “AppleScript”, “Apple People”, “Newton Script”, “Theme”, “XML”, “Switch”, “Xcode”, “HTML”, “SMILE”}
        
tell journal AppleScript
          set j1Count to count every journal entry
          
tell journal entry 1
            set a to plain text content
            
journal entryに対してpropertiesの取得が行えない
            
ものすごくバグっぽい仕様
          end tell
        end tell
      end tell
    end tell
  end tell
end tell

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

2009/04/14 MacJournalで書類のプロパティを取得

MacJournal 5で書類のプロパティを取得するAppleScriptです。

スクリプト名:MacJournalで書類のプロパティを取得
tell application MacJournal
  tell document 1
    properties
  end tell
end tell
> {modified:false, class:document, path:”/Users/maro/Library/Application Support/MacJournal/MacJournal Data.mjdoc”, selected entry:missing value, name:”MacJournal Data”}

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

2009/04/14 MacJournalでアプリのプロパティを取得

MacJournal 5のアプリケーションのプロパティを取得するAppleScriptです。

MacJournal 5は、Webの内容をスクラップしておくスクラップブックとして活用しています。このソフトは、多くの機能がAppleScriptに対応しているように見えるのですが、AppleScript系の機能は割と作り込みが甘くて、「これはないんじゃない?」とか「バグでは?」といった実装が見受けられます。

AppleScript系の機能が甘いだけであり、普通にGUIから利用している分には使い勝手のいい、よいソフトだと思っています。

スクリプト名:MacJournalでアプリのプロパティを取得
tell application MacJournal
  properties
end tell

> {frontmost:false, class:application, version:”5.1.3″, name:”MacJournal”, selected entry:missing value, main document:document “MacJournal Data” of application “MacJournal”}

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

2009/04/05 数値を「時間」「分」でフォーマットしたテキストで返す

時間の数値(単位:秒)を「時間」「分」でフォーマットしたテキストとして返すAppleScriptです。

処理に長い時間を要するバッチ処理のプログラムで、途中経過をtwitterで報告しようとして、単に経過時間を分で返すだけでは分りづらかったので、これをフォーマットするために作ったものです。

スクリプト名:数値を「時間」「分」でフォーマットして返す
set aTime to (time to GMT) + 1800
set aText to retTimeText(aTime) of me
> "9時間30分"

数値を「時間」「分」でフォーマットして返す
on retTimeText(aTime)
  set aHour to aTime div 3600
  
set aMinute to (aTime mod 3600) / 60
  
set aString to ""
  
if aHour > 0 then
    set aString to aHour & "時間"
  end if
  
if aMinute > 0 then
    set aString to aString & (aMinute as integer) & ""
  end if
  
  
return (aString as string)
end retTimeText

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

2009/04/05 選択したフォルダの下にある空っぽのフォルダを取得

指定フォルダ以下の「何も入っていない」「空っぽ」のフォルダのみを取得するAppleScriptです。

……MLに転がっていたScriptですが、肝心の用途はさっぱり分りません。

スクリプト名:選択したフォルダの下にある空っぽのフォルダを取得
set aFol to choose folder
tell application "System Events"
  set empList to path of folders of aFol whose size is 0
end tell

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

2009/04/03 指定名称のプログラムを強制終了させる

指定名称のプログラムを強制終了させるAppleScriptです。指定文字列を含むプロセスを取得して、killコマンドで強制終了させます。

スクリプト名:指定名称のプログラムを強制終了させる
kill_aProc("InDesign CS3") of me

指定名称のプログラムを強制終了させる
on kill_aProc(aProcName)
  tell application "System Events"
    set procList to every process whose name contains aProcName
    
if procList is not equal to {} then
      set aProc to contents of first item of procList
      
tell aProc
        set anID to unix id
      end tell
      
do shell script "kill -9 " & (anID as string)
    end if
  end tell
end kill_aProc

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

2009/04/03 version テスト

指定フォルダの中に入っているAppleScriptのうち、指定文字列を含むファイル名のものの中で一番バージョン番号が大きいもののパスを返します。

  プログラム v1.2.4
  プログラム v1.5
  プログラム v1.5.1

という3つのAppleScriptが指定フォルダ内に存在していた場合、v1.5.1のパスが返ります。AppleScriptを複数のScriptファイルに分割してロード&実行するような場合に、パーツのAppleScriptが入っているフォルダの中で最新のものを読み込むように作ったものです。

スクリプト名:version テスト
set aFol to choose folder
set aName to "プログラム v"
set aRes to retNewestVersionNumberNameFile(aFol, aName) of me
> alias "Cherry:Users:maro:Desktop:名称未設定フォルダ:プログラム v1.5.1.scpt"

指定フォルダ中の指定文字列をファイル名に含む最新のバージョン番号のファイルを選択
on retNewestVersionNumberNameFile(aFol, aName)
  本プログラムが成立するのは、「1.6.2N」のように数字の並びの外にアルファベットが存在している場合のみ
  
「1.X.2」のように非数字文字が途中に入っているとダメ
  
  
tell application "Finder"
    tell folder aFol
      set fList to a reference to (every file whose name contains aName and file type of it = "osas") 高速化のためのa reference toではない
    end tell
  end tell
  
  
  
set nList to name of fList
  
  
set numList to {}
  
repeat with i in nList
    set j to replaceText(i, aName, "") of me
    
set j2 to retFileNameWithoutExt(j) of me
    
set j3 to cleanNumStr(j2)
    
set the end of numList to j3
  end repeat
  
  
set aRes to shellSortWithNumericStrings(numList) of me
  
set bRes to reverse of aRes 大きい順に並べる
  
  
set fItem to contents of first item of bRes
  
tell application "Finder"
    tell folder aFol
      set aLatestFiles to (every file whose name contains aName and name of it contains fItem)
    end tell
  end tell
  
  
最新のバージョン番号のスクリプトが選択される
  
set aLatestFile to (first item of aLatestFiles) as alias
  
return aLatestFile
  
end retNewestVersionNumberNameFile

数字と小数点以外の文字を除去する
on cleanNumStr(aStr)
  set nStrList to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "."}
  
set sList to characters of aStr
  
set nList to {}
  
repeat with i in sList
    set j to contents of i
    
if j is in nStrList then
      set the end of nList to j
    end if
  end repeat
  
  
return (nList as string)
end cleanNumStr

ファイル名から拡張子を外す
on retFileNameWithoutExt(fileNameStr)
  set fLen to length of fileNameStr
  
set revText to (reverse of (characters of fileNameStr)) as string 逆順テキストを作成
  
set anOffset to offset of "." in revText
  
set fRes to text 1 thru (fLen - anOffset) of fileNameStr
  
return fRes
end retFileNameWithoutExt

任意のデータから特定の文字列を置換
on replaceText(origData, origText, repText)
  set curDelim to AppleScript’s text item delimiters
  
set AppleScript’s text item delimiters to {origText}
  
set origData to text items of origData
  
set AppleScript’s text item delimiters to {repText}
  
set origData to origData as text
  
set AppleScript’s text item delimiters to curDelim
  
set b to origData as text
  
return origData
end replaceText

shell sortだが、numeric stringsを考慮する
on shellSortWithNumericStrings(a)
  set n to length of a
  
set cols to {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1}
  
repeat with h in cols
    considering numeric strings
      if (h (n - 1)) then
        repeat with i from h to (n - 1)
          set v to item (i + 1) of a
          
set j to i
          
repeat while (j h) and ((item (j - h + 1) of a) > v)
            set (item (j + 1) of a) to (item (j - h + 1) of a)
            
set j to j - h
          end repeat
          
set item (j + 1) of a to v
        end repeat
      end if
    end considering
  end repeat
  
return a
end shellSortWithNumericStrings

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

2009/04/03 複数リストの合成

複数の、すべての項目数が同じリストを合成するAppleScriptです。{{1, 2, 3}, {”a”, “b”, “c”}, {”あ”, “い”, “う”}}というリストを与えると、 {{1, “a”, “あ”}, {2, “b”, “い”}, {3, “c”, “う”}} のように合成します。

「すべての項目数が同じ」というのがひっかかって、結局その後で「項目数が違っても大丈夫」なルーチンを作ることになるのですが、用途によってはこのサブルーチンでも使えたりすることでしょう。

スクリプト名:複数リストの合成
set aList to {{1, 2, 3}, {"a", "b", "c"}, {"", "", ""}}
set bList to somelistAdd(aList) of me
> {{1, "a", "あ"}, {2, "b", "い"}, {3, "c", "う"}}

複数のリストを合成
すべて同じ要素数である必要がある。また、複数のリストを{aList,bList,cList}とペアにして
本ルーチンに渡す必要がある
on somelistAdd(aList)
  set aCount to count every item of aList
  –
> 3
  
  –
渡された入れ子リスト内の各要素の数が同じかどうかチェック
  
set countList to {}
  
repeat with i from 1 to aCount
    set bCount to count every item of item i of aList
    
set the end of countList to bCount
  end repeat
  –
> {3, 3, 3}
  
set {aResF, aResN} to retSameEveryItem(countList) of me
  
if aResF = false then return合成する要素内の要素数が合っていなかったら処理を行わない
  
  –
合成を行う
  
set newList to {}
  
repeat with i from 1 to aResN
    set anItem to {}
    
repeat with ii from 1 to aCount
      set jj to contents of (item i of item ii of aList)
      
set the end of anItem to jj
    end repeat
    
set the end of newList to anItem
  end repeat
  
  
return newList
end somelistAdd

リスト中の全要素が同じかどうかをbooleanで返す
on retSameEveryItem(aList)
  set a to item 1 of aList
  
set aList to rest of aList
  
set aFlag to true
  
repeat with i in aList
    if a is not equal to contents of i then
      set aFlag to false
      
exit repeat
    end if
  end repeat
  
return {aFlag, a} –Booleanとそのデータを返す
end retSameEveryItem

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

2009/04/03 ソート用のカラムを生成する

{{999,2}, {2,999}, {999,9} }のような値がペアになっているリストがあって、これをソートしようとしても途中に値が999の列(カラム)があって、そのままでは希望したとおりにソートできない……そんなケースに対応すべく、各アイテム内の値を調べて「999ではないアイテム」をソート用のキーとして追加する処理を行うAppleScriptです。

スクリプト名:ソート用のカラムを生成する
set aList to {{”1“, “1“}, {”2“, “999“}, {”3“, “3“}, {”4“, “999“}, {”5“, “5“}, {”999“, “6“}}
set bList to addSortColumn(aList) of me
> {{”1″, “1″, “1″}, {”2″, “999″, “2″}, {”3″, “3″, “3″}, {”4″, “999″, “4″}, {”5″, “5″, “5″}, {”999″, “6″, “6″}}

ソート用のカラムを生成する
on addSortColumn(aList)
  set aCount to count every item of aList
  
  
repeat with i from 1 to aCount
    
    
set j1 to contents of item 1 of item i of aList
    
set j2 to contents of item 2 of item i of aList
    
    
if j1 = “999then
      if j2 = “999then
        –j1, j2の両方とも999だった
        
set j3 to999
      else
        set j3 to j2
      end if
    else
      –通常処理
      
set j3 to j1
    end if
    
    
set the end of item i of aList to j3
    
  end repeat
  
  
return aList
end addSortColumn

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