Archive for the 'Omni Outliner' Category

2010/01/17 OniOutlinerで選択中の行の内容のうち指定列のデータをすべて取得

OmniOutliner Professional v3.9.5で(通常のOmni Outlinerもtellブロックのアプリ名称を変更すればそのまま動作)、選択中の行のデータの中から指定列(カラム)のデータをすべて取得するAppleScriptです。

つまり、選択行の中の指定カラムのデータを取得するものです。こうした機能が標準搭載されていないほうがおかしいような気がします。そのままGUI上でExcelに選択データをペーストすると、1つの列の中にすべてのデータが入ってしまうなど、動作内容がいまいちです。

そこで、AppleScriptの登場となるわけで……旅行からの帰りの電車の中で勢いだけで作ってしまいました。

まずは、Onni Outliner上で行を選択。

omni1.jpg

スクリプトを実行すると、どの列のデータを取得するか聞いてきます。Command-クリックを行うことで、複数の列のデータを指定できます。

omni2.jpg

ためしに、「トピック」列と「Column2」列を選択すると……

{{”line2″, “”}, {”line3″, “●”}, {”line4″, “●”}, {”line5″, “”}}

といった結果が得られます。これは、Excelに貼付けることを前提としてデータを作成しているものであり、あとはExcelへのデータ貼り付けルーチンを作って用意すれば、便利に使えそうです。

excel1.jpg

……結局、Excelのワークシートを新規作成して、データ転送するところまで作り込んでしまいました。ここまでやると、たしかに便利。

スクリプト名:OniOutlinerで選択中の行の内容のうち指定列のデータをすべて取得
global tList, numRes
set tList to {}

tell application “OmniOutliner Professional”
  tell document 1
    set aSel to every row whose selected is true
    
if aSel = {} then
      display dialog “OmniOutliner上で選択されている行はありませんでした。” buttons {“OK”} default button 1
      
return
    end if
  end tell
end tell

–どの列を書き出すかを選択
tell application “OmniOutliner Professional”
  tell document 1
    set nList to name of every column
    
set aMes to “項目を選択してください(Command-クリックで複数選択可能)”
    
set numRes to retMultipleItemFromListByItemNo(nList, aMes) of me
  end tell
end tell

–選択部分を検出
tell application “OmniOutliner Professional”
  tell document 1
    set aaSel to first item of aSel
    
tell aaSel
      set aCell to text of every cell
      
set aCell to retSpecifiedItemFromList(numRes, aCell) of me
      
set the end of tList to aCell
      
set cList to every child
      
repeat with i in cList
        getChildText(i) of me
      end repeat
    end tell
  end tell
end tell

tList
–> {{”line2″, “”}, {”line3″, “●”}, {”line4″, “●”}, {”line5″, “”}}

–再帰で指定child以下のテキストをすべて取得する
on getChildText(aRoot)
  tell application “OmniOutliner Professional”
    tell document 1
      tell aRoot
        set aCell to text of every cell
        
set aCell to retSpecifiedItemFromList(numRes, aCell) of me
        
set the end of tList to aCell
        
        
set cList to every child
        
repeat with i in cList
          getChildText(i) of me –再帰処理
        end repeat
      end tell
    end tell
  end tell
end getChildText

–リストから選択してアイテム番号を返す(複数項目選択対応)
on retMultipleItemFromListByItemNo(aList, aMes)
  set aRes to choose from list aList with prompt aMes with multiple selections allowed
  
if aRes = false then return 0
  
  
set hitList to {}
  
repeat with i1 in aRes
    set aRes to contents of i1
    
set hitNum to 1
    
repeat with i in aList
      set j to contents of i
      
if j is equal to aRes then
        exit repeat
      end if
      
set hitNum to hitNum + 1
    end repeat
    
set the end of hitList to hitNum
  end repeat
  
return hitList
end retMultipleItemFromListByItemNo

–指定リストから、指定アイテム目を抽出して返す
on retSpecifiedItemFromList(itemNumList, dataList)
  set newList to {}
  
repeat with i in itemNumList
    set j to contents of i
    
set a to contents of (item j of dataList)
    
set the end of newList to a
  end repeat
  
return newList
end retSpecifiedItemFromList

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

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…)