Archive for the 'Notes' Category

2017/09/19 Notesで選択中のnoteやfolderの情報を取得する?

defaultsコマンド経由でNotes.app(日本語ローカライズ名:メモ.app)で選択中のnoteやfolderの情報を取得する(参考になるかもしれない)AppleScriptです。

selectionとかselected folderなどの用語が用意されていないことでおなじみのNotes.app。「現在表示中のノート」を処理したいのはやまやまですが、用語辞書に書かれていない機能は、まっとうな手段では呼び出せません。

となると、「まっとうでない方法」を検討することになります。

まっとうでない手段を選ぶことで、スピード低下、安定性のなさ、メンテナンスの手間など負の側面と向き合う必要が出てきますが、問題自体の解決は行えます。

(1)GUI Scripting
まっとうでない方法の筆頭。画面上から無理やり情報を取得して、選択状態にあるGUI部品のタイトルを取得することで、選択中のノートの情報を特定できそうです。興味と必要性がないので深追いしていませんが、Notes.appの各種表示状態(アカウント情報一覧を表示するとか、表示を隠すとか)に合わせて数パターンの処理を用意しておくことで、実現できるメドは立っています。

ただし、GUI Scriptingのつねとして、「スピードは通常のAppleScriptの100倍以上遅い」(Cocoa経由の処理と比較すると数万倍遅い)「予期しないアプリケーション側の表示には追従できない」「OSやアプリケーションのバージョンアップにともない、表示内容やGUI部品の階層が変わったぐらいで書き換えが必要になる」ということから、多用は避けたいところです。

(2)defaultsコマンド
まっとうでない方法として有名。アプリケーションの設定情報を直接読んで処理します。アプリケーションやOSがバージョンアップして内部情報が変更されると動かなくなるのはGUI Scripting同様。

defaultsコマンドから得られる情報をAppleScriptネイティブのデータ形式(recordとか)に変換するのが面倒でしたが、Cocoaの機能を利用して割と手軽に読み込めるようになってきました。

Terminal上で、

  defaults read com.apple.Notes

を実行してみたところ、設定情報の中に現在選択中のnoteおよびfolderを記録している箇所があったので、実際にAppleScript中に記述して取り出してみました。

今回掲載したのが、そのdefaultsコマンドを利用した情報取得のサンプルです。このデータをもとにSQLiteのデータベースを検索してみればいいかも、などと思ってデータベースを漁ってみたものの、

notes_sqlite3_resized.png

defaultsから得られたような形式のID(UUIDっぽい?)はDB中に記録されていないようで、ちょっと残念です(SQLiteではなくCoreData経由で調べるべき?)。もう少し調べてみると手がかりが見つかるかもしれませんが、出先の電車の中で調べた程度だったのでこのぐらいです。

AppleScript名:Notesで選択中のnoteやfolderの情報をdefaults経由で取得する
– Created 2016-10-31 by Takaaki Naganoya
– 2016 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
–http://piyocast.com/as/archives/4827

set sRes to do shell script ” defaults read com.apple.Notes ArchivedUIState”
set aDict to deserializeToPlistString(sRes) of me

set curNote to (aDict’s valueForKey:“currentNote”) as string
–>  ”860327F4-4E6F-44FB-92EC-720B47CDD38A”

set curNoteFol to (aDict’s valueForKey:“currentNoteFolder”) as string
–>  ”184daff620aca4ad23fd2bf70d0b76af”

set folderListHidden to (aDict’s valueForKey:“folderListHidden”) as integer as boolean
–>  false

return {curNote, curNoteFol, folderListHidden}

–XML-format plist string–> list or record
on deserializeToPlistString(aStr as string)
  set deStr to current application’s NSString’s stringWithString:aStr
  
set theData to deStr’s dataUsingEncoding:(current application’s NSUTF8StringEncoding)
  
set aList to current application’s NSPropertyListSerialization’s propertyListWithData:theData options:(current application’s NSPropertyListMutableContainersAndLeaves) |format|:(missing value) |error|:(missing value)
  
return aList
end deserializeToPlistString

★Click Here to Open This Script 

2017/01/03 Notesの指定エントリの本文をプレーンテキストとして取得

macOS標準搭載アプリ「メモ」(英語名:Notes)の指定エントリの本文をプレーンテキストとして取得するAppleScriptです。

メモの本文(body)がHTMLとして取得されるので、HTMLからスタイル付きテキスト(NSAttributedString)を経由してプレーンテキストに変換します。

AppleScript名:Notesの指定エントリの本文をプレーンテキストとして取得
– Created 2017-01-03 by Takaaki Naganoya
– 2017 Piyomaru Software
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”

tell application “Notes”
  tell note 1 –とりあえず最新のエントリを指定
    set theBody to body
  end tell
end tell

set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set plainText to (styledString’s |string|()) as string

★Click Here to Open This Script 

2015/09/19 Notes上の指定のエントリをHTMLとして書き出す

Cocoaの機能を使って、Notes(日本語名:「メモ」)の指定エントリの内容をHTMLとして書き出すAppleScriptです。

ただ、普通にPDFやRTFと同様に出力してみたら・・・文字化けしてしまいました(汗)。

html1.png

UTF-8で出力しているはずなのですが、

html2.png

Safariで文字エンコーディングを「日本語(Shift JIS)」に設定すると・・・

html3.png

html4.png

文字化けしなくなります。

html5.png

保存されたHTMLのソースを見ると、エンコーディングはUTF-8となっているのですが、ソースをUTF-8でオープンしても文字化けしたままです。

AppleScript名:Notes上の指定のエントリをHTMLとして書き出す
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-19 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set targFol to POSIX path of (path to desktop)

tell application "Notes"
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding)
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set cRes to my saveStyledTextAsHTML(theName, targFol, styledString)
–> true

–スタイル付きテキストを指定フォルダ(POSIX path)にHTMLで書き出し
on saveStyledTextAsHTML(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings toHTML
  
set theNSDictionary to current application’s NSMutableDictionary’s dictionaryWithObject:(current application’s NSHTMLTextDocumentType) forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set theNSData to aStyledString’s dataFromRange:{location:0, |length|:aStyledString’s |length|()} documentAttributes:theNSDictionary |error|:(missing value)
  
  
set aHTML to current application’s NSString’s alloc()’s initWithData:theNSData encoding:(current application’s NSUTF8StringEncoding)
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:"/" withString:"_"
  
set theName to theName’s stringByReplacingOccurrencesOfString:":" withString:"_"
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"html"
  
  
return (aHTML’s writeToFile:thePath atomically:true) as boolean
  
end saveStyledTextAsHTML

★Click Here to Open This Script 

一応、Notes(メモ)から取得した本文データがHTMLだったので、Styled Textに変換しないでそのまま保存するバージョンも作ってみました。こちらであれば、文字化けは見られませんが・・・Styled Text(NSAttributedString)をHTMLに変換してファイル出力するという機能は、普通に文字化けせずに使えてほしいので、回避策を検討しておきたいところです。

AppleScript名:Notes上の指定のエントリをHTMLとして書き出す v2
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-19 by Takaaki Naganoya
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"

set targFol to POSIX path of (path to desktop)

tell application "Notes"
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
–>  (NSString) "<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">ASOCでできないこと<div><br></div><div>CFString の文字列(Cの文字列)を扱えない</div><div><br></div><div>block構文を必要とするAPIを呼べない</div><div><br></div><div>Key Value Observation を使えない(Xcode上ではOK?)</div></body></html>"

set aRes to my saveStyledTextAsHTML(theName, targFol, anNSString)

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsHTML(aFileName, targFol, anNSString)
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:"/" withString:"_"
  
set theName to theName’s stringByReplacingOccurrencesOfString:":" withString:"_"
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"html"
  
  
return (anNSString’s writeToFile:thePath atomically:true) as boolean
  
end saveStyledTextAsHTML

★Click Here to Open This Script 

2015/09/18 Notes上の指定のエントリをPDFやRTFとして書き出す

Cocoaの機能を使って、Notes(日本語名:「メモ」)の指定エントリの内容をPDFやRTFとして書き出すAppleScriptです。

  「・・・そんなもん作ってどうするんだ、本当に必要なのか?」

と、私自身が感じた内容ではありましたが、Shaneが質問に答えてMLに投稿し、それを私が日本語環境で検証して「文字化けするよー」とメールで報告してやりとりして、「ああ、Encodingがちがうんだー」ということでめでたく動くようになりました(NotesがデータをUTF-8ではなくUTF-16で保持していたのが原因ですが・・・El Capitanの新形式=iOS9上の新形式 だとどーなんだろう???)。

動くようになってはみたものの、あまりに特定の目的に最適化されたScriptだったので、データ取得部分と保存部分を別々に分け、スタイル付きテキストをPDFやRTFとして保存できるルーチンに整備して汎用性を確保しておきました。こういうのを作っておくと、あとになって地道に効いてくるはずです。たぶん・・・きっと。

実行すると、お手元の環境の「メモ」アプリの最新から2つ目のエントリの名称をファイル名にして、本文内容をデスクトップにPDFとRTFで保存します。

notes_entry.png

filenames.png

pdf.png

rtf.png

AppleScript名:Notes上の指定のエントリをPDFやRTFとして書き出す
– Created 2015-09-18 by Shane Stanley
– Modified 2015-09-18 by Takaaki Naganoya
use AppleScript version “2.4″
use scripting additions
use framework “Foundation”
use framework “AppKit”

set targFol to POSIX path of (path to desktop)

tell application “Notes”
  set theBody to body of note 2
  
set theName to name of note 2 – for file name
end tell

– Notesの本文をスタイル付きテキストに
set anNSString to current application’s NSString’s stringWithString:theBody
set theData to anNSString’s dataUsingEncoding:(current application’s NSUTF16StringEncoding) –日本語の環境&内容で検証ずみ。Chineseとかはどうか?
set styledString to current application’s NSAttributedString’s alloc()’s initWithHTML:theData documentAttributes:(missing value)

set aRes to my saveStyledTextAsPDF(theName, targFol, styledString)
–> true

set bRes to my saveStyledTextAsRTF(theName, targFol, styledString)
–> true

–スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し
on saveStyledTextAsRTF(aFileName, targFol, aStyledString)
  –Convert NSMutableStyledStrings to RTF
  
set bstyledLength to aStyledString’s |string|()’s |length|()
  
set bDict to current application’s NSDictionary’s dictionaryWithObject:“NSRTFTextDocumentType” forKey:(current application’s NSDocumentTypeDocumentAttribute)
  
set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“rtf”
  
  
return (bRTF’s writeToFile:thePath atomically:true) as boolean
end saveStyledTextAsRTF

–スタイル付きテキストを指定フォルダ(POSIX path)にPDFで書き出し
on saveStyledTextAsPDF(aFileName, targFol, aStyledString)
  – get page size being used for printing
  
set printInfo to current application’s NSPrintInfo’s sharedPrintInfo()
  
set pageSize to printInfo’s paperSize()
  
set theLeft to printInfo’s leftMargin()
  
set theTop to printInfo’s topMargin()
  
  
– make a text view
  
set theView to current application’s NSTextView’s alloc()’s initWithFrame:{origin:{x:0, y:0}, |size|:pageSize}
  
theView’s setTextContainerInset:{theLeft, theTop}
  
  
– put in the text
  
theView’s textStorage()’s setAttributedString:aStyledString
  
set theData to theView’s dataWithPDFInsideRect:{origin:{x:0, y:0}, |size|:pageSize}
  
  
– build path based on title
  
set theName to current application’s NSString’s stringWithString:aFileName
  
set theName to theName’s stringByReplacingOccurrencesOfString:“/” withString:“_”
  
set theName to theName’s stringByReplacingOccurrencesOfString:“:” withString:“_”
  
set thePath to current application’s NSString’s stringWithString:targFol
  
set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:“pdf”
  
  
return (theData’s writeToFile:thePath atomically:true) as boolean
end saveStyledTextAsPDF

★Click Here to Open This Script 

2014/02/02 iOSデバイスからMac上のScriptを実行するOtto’s Remote & Otto’s Antenna

Otto’s Remote & Antennaは、iOSデバイス上のOtto’s Remoteアプリケーション(100円)から、Mac上のOtto’s Antenna(記事執筆時点では200円→無料)に指令を送って、Mac上のAutomatorアクション、Shell Script、AppleScriptをMac上で実行させるソリューションです。

Otto’s RemoteはiPhoneでもiPadでも実行できるUniversalアプリですが、このアプリの性格を考えれば絶対にiPhoneで使うべきです。

AppleScript使いにとって本ソフトは、用途がありすぎてとても書き切れないほどの可能性があるので、かなりていねいにチェックしたいところです。

本Blogの性格上、Automatorとshell scriptは完全にスルーして、AppleScriptにのみフォーカスしてレビューします。

レビュー時のバージョン:
 Otto’s Antenna: ver 1.3
 Otto’s Remote: ver 1.3.2

 → Otto’s AntennaのWeb

インストールとセットアップ

最初に、iOSデバイス(iOS 6.1以降)にOtto’s Remoteを、Mac(OS X 10.8以降)にOtto’s Antennaをインストールする必要があります。また、iOSデバイスとMacの両方とも同一のApple IDを使っている必要があります。これは、Otto’s Remote/AntennaがiCloudの通知システムを利用しているためです。

同一のApple IDを使っていれば、複数のMac上のAppleScriptの実行をiPhone側から行うことも可能です。

Mac側のScriptフォルダ(~/Library/Application Scripts/com.amolloy.ottoantenna/)に入れておいたAppleScriptが、iOSデバイス側のOtto’s Remoteの画面上に表示されます。これを選択して実行することになります。

otto0.png

セットアップで悩んだり、ハマったりすることはとくにありませんでした。

さあ実行だ!

iOS上のOtto’s Remote上のScript名を(例:say Hello)タップすると、

「Are you sure you wish to perform say Hello?」

と聞かれます。選択肢は、

Yes, this time.
Yes, every time.
Yes, for all actions.
No, thank you

の4つ。

毎回実行するとか、他のアクション(script)実行時に必ず実行するとかいうのは、とっても危険な香りがする(解除方法が提供されていない)ので、正直なところ最初の「Yes, this time」と最後の「No, thank you」以外の選択肢は使わないはずです。

まずは、小手調べということで……英語のファイル名のAppleScriptをMac側のScriptフォルダに入れてiPhone側から実行。iPhoneがWiFi環境にいても、LTEのネットワーク側にいても、だいたい10秒前後でMacに指令が届いて実行されました。

実行対象のMacがスリープ状態(たとえば、MacBook Airをクローズした状態)だと、指定のAppleScriptは実行されません。「システム環境設定」のPower Napをオンにした状態でも、Scriptは実行されませんでした。これは、Otto’s Antenna側がPower Nap実行のためのサービスを実装していないことが考えられます。

【重要】Otto’s Antennaを運用させる際には、Macの電源は入れたままにしておく必要があります。

日本語にちゃんと対応しているかな?

次に、Mac側のScriptフォルダに「こんにちは」と日本語のファイル名を付けたAppleScriptを置き、iOSデバイス側でブラウズすると……「こんにちは」および「こんにちは〜」と存在しないファイルが見えてしまいます(やっぱり日本語ではテストしてないだろうな〜)。

otto1.png

img_2298.PNG

「こんにちは」Scriptは実行できましたが、「こんにちは~」Scriptはそもそも存在しないので、実行できません。

この問題は、どうやらMac側のOtto’s Antennaの問題らしく、Mac上でステータスバーのメニューから「こんにちは〜」を選択して「Delete」を実行すると、Mac側のメニューにも出なくなりますし、iOS側にも表示されなくなります。

日本語の「絵文字」(Japanese Mobile Emoji Characters)には対応しており、MacのFinder上で絵文字を入力してファイル名に絵文字を入れると、Mac上のOtto’s Antennaのメニュー上にも表示されますし、iOS上のOtto’s Remote上にも表示されます。

otto4.png

img_2299.PNG

日本語ファイル名にかぎらず、名称変更したり元のScriptが見つからなくなると、メニュー上では赤く表示されたままメニューに残ります(赤く表示するぐらいなら、メニュー上から削除したほうが)。

本気でためしてみよう!

階層構造実験

まずは、Mac側のScriptフォルダにフォルダを作成して、Otto’s Antennaがフォルダの階層構造を認識するかどうかという実験。

ためしてみると、きちんとOtto’s Antennaがフォルダ内に格納したScriptを検出しました。これについては合格点です。

AppleScriptファイル形式実験

次に、どのような形式のAppleScriptを認識・実行してくれるかどうかの実験です。目下、OS X 10.9環境の「AppleScriptエディタ」では、

 通常AppleScript:拡張子「.scpt」
 通常AppleScriptテキスト:拡張子「.applescript」
 通常AppleScriptスクリプトバンドル:拡張子「.scptd」
 AppleScriptアプレット:拡張子「.app」
 AppleScriptObjCアプレット:拡張子「.app」

を作成可能です。Otto’s Antennaが、これらのうちどこまでを「AppleScript」として扱うのかを確認しておく必要があります。

 通常AppleScript:拡張子「.scpt」→実行可
 通常AppleScriptテキスト:拡張子「.applescript」→実行可
 通常AppleScriptスクリプトバンドル:拡張子「.scptd」→実行可
 AppleScriptアプレット:拡張子「.app」→Otto’s Antennaに認識されず
 AppleScriptObjCアプレット:拡張子「.app」→Otto’s Antennaに認識されず

できることとできないことを、明確にしておくことは重要です。

位置情報をトリガーにしてAppleScript実行!

現行バージョンでは、iOSデバイス上で位置情報(Geo Location)を取得して、そこに到着するか出発するかを実行トリガとして使用できます。

バッテリーが少なくなってきたら実行とか、iOSデバイスの温度センサーが設定温度よりも低い/高い場合には実行とか、メールで呪いのメッセージが送られてきたら実行とかいう機能はありません。iOSデバイスを振ると実行とか、音声認識で実行とかはできてもいいような気もします。

実行トリガを設定できるのはよいのですが……実行時の結果をiOS上のOtto’s Remote側に返せないので、そのあたりが気になります。

また、Otto’s RemoteをiOS上でバックグラウンドに回した状態でこれを実行してくれるでしょうか?

そこで、これらを試すべく2本のAppleScriptを書き、Mac上のOtto’s Antennaに登録して実験してみました。

otto10.png

スクリプト名:メモに外出時刻を書く
–タイムスタンプからユニークなタイトルを作成
set aTitle to “てすと” & (do shell script “date +%Y%m%d%H%M%S”)
set aBody to “ぴよまるさんが、家を出ました。
Piyomaru left home.”

makeNewNoteOnNotes(aTitle, aBody, “iCloud”) of me

on makeNewNoteOnNotes(aTitle, aBody, anAccountName)
  set noteHTMLText to

"

& (aBody as Unicode text) & “”
  
  
tell application “Notes”
    –activate
    
tell account anAccountName
      make new note at folder “Notes” with properties {name:aTitle, body:noteHTMLText}
    end tell
  end tell
end makeNewNoteOnNotes

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

スクリプト名:メモに帰宅時刻を書く
–タイムスタンプからユニークなタイトルを作成
set aTitle to “てすと” & (do shell script “date +%Y%m%d%H%M%S”)
set aBody to “ぴよまるさんが、家に帰りました。
Piyomaru return to home.”

makeNewNoteOnNotes(aTitle, aBody, “iCloud”) of me

on makeNewNoteOnNotes(aTitle, aBody, anAccountName)
  set noteHTMLText to

"

& (aBody as Unicode text) & “”
  
  
tell application “Notes”
    –activate
    
tell account anAccountName
      make new note at folder “Notes” with properties {name:aTitle, body:noteHTMLText}
    end tell
  end tell
end makeNewNoteOnNotes

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

登録したGPS位置情報から離れる(departing)/到着する(arriving)とAppleScriptの実行リクエストを行う「Geo Trigger」をそれぞれ登録。

img_2302.PNG

iPhoneの画面をオフにした状態でカバンに入れて自転車で移動。

5Kmほど離れた目的地に到着して、カバンからiPhoneを出して確認すると、通知センターに、

「Fired: メモに外出時刻を書く on MBPretina」

と表示がありました。成功です。画面表示時ではなく、はるかに前に実行されたことが確認できました。

img_2300.PNG

メモを見ると、「てすと20140202141308」のエントリが作成されており、

「ぴよまるさんが、家を出ました。
Piyomaru left home.」

と記入されていました。

帰宅時に実行されるScriptも無事動作していました。

ただ、出かける際にほぼフル充電だったバッテリーは4時間後の帰宅時には45%まで減っており、iPhone上でOtto’s Remoteを(GPS情報をトリガにするリクエストを登録して)実行させたまま1日運用するのはちょっと心もとないですね。真剣に位置情報をトリガにしたScriptを運用するのであれば、外部バッテリーの併用は欠かせないことでしょう。

Otto’s Antenna&Otto’s Remoteに必要不可欠な機能

まず、AppleScript(だけ)にパラメータを渡せないのはダメです。ダメを通り越してありえないです。早急に対応していただく必要があると思います。Otto’s Antennaが日本語の不必要なファイルをリストアップしてしまう問題も解消されるべきです。

あと、Automator Action/Shell Script/AppleScript全般に、実行結果を返せないのと、実行されたかどうかの確認ができないのもダメです。

ただし、緊急避難的にこれらの問題を解決する方法は存在しています。メモやリマインダー経由でiOSデバイスとMac間の情報のやりとりを行うというものです(もちろん、メールやメッセージ(iChat)で行ってもかまいません)。Otto’s Antenna&Remoteに多くを期待しないとそういう対応も行えます…………が、ここは少しOtto’s Antenna+Remoteでなんとかしていただきたいところです。

あとは、AppleScript側で受信できる追加パラメータとして、iOSデバイス側の実行タイムスタンプと位置情報(緯度、経度情報)が欲しいところです。

結論:こいつは使える!

本当に使えるのか半信半疑でしたが、たしかにこれは使えます。もっと注目されるべきアプリといえるでしょう。

iPhoneからMac上のAppleScriptの実行をキックできると、いろいろな処理が考えられます。

簡単なところでは、出力に時間のかかる(=出力枚数が多いので、給紙が必要+他の印刷物の状況を見る必要がある)書類の印刷を共用のカラーレーザープリンターで行う際に、プリンターの前まで行って、iPhoneから自分のデスクのMacのプリントアウトのAppleScriptを実行するとかいうのは、実際に実用性のある用途だと思います。

Mac側とiPhone側でCloudを介してデータを共用しているタイプのアプリケーションは、両者のI/O用に使えます。DropBoxなどでファイルをMacからiPhoneに渡すという処理も簡単ですし、Evernote経由でI/Oを行ってもよいと思います。

処理結果をMailやTwitter、WordPress経由で返すのも当然アリですが……データ転送量にしたがって課金されるタイプのサービスは避けたいところです。

2013/12/18 Notesの指定のメモからタグを除去

OS X 10.8あたりからOS標準装備アプリに加わった「メモ」(Notes.app)の、指定のメモ(note)から内容を取得してタグを外すAppleScriptです。

→ macOS 10.10以降はこちら「Notesの指定エントリの本文をプレーンテキストとして取得」

メモ(以下、Notes.app)は文字色や文字種類など、さまざまな指定が可能なマルチスタイルのテキストを保存可能なメモアプリケーションです。

勝手にiCould経由でiOSデバイスとシンクロしてくれるので、iPhoneのメモに何か命令を書いておくと、それをMac側で検知して結果をNotes.app経由でiPhoneに戻すような処理もAppleScriptで記述可能です(そんな面倒なことをするよりも、メッセージ(旧称:iChat)経由でダイレクトにやり取りしたほうが早いですが)。

つまり、Notesやリマインダーは、iCloudを経由してiOSデバイスからMacをコントロールするための「経路」としても使えるものです(そんなかったるいことをするよりも、メッセージで直接コンタクトしたほうがいいですが)。

そんな遠大な野望を実現するための第一歩として(?!)、Notes.appの特定のメモから、本文部分を取得する処理を書いてみました。

Notes.appは本文を取得してみると「タグがついたままのHTMLっぽい何かのテキスト」で返してくるため、プレーンなテキストに変換したい気持ちでいっぱいです。

……そんなに難しい処理でもないので、さくっと書いてしまいました。

書いておいてナンですが、あんまり実用性はないですね。

notes1.png

notes2.png

いろいろ変換を行ってみたものの、アプリケーション上とそっくり同じ位置で改行されるとか、そういう風にはならず……あちらを立てればこちらが立たず……そんなに気合いを入れるようなものでもないので、こんなもんでしょう。

スクリプト名:Notesの指定のメモからタグを除去
tell application “Notes”
  tell note “伊集院光 「ファミ通と僕」出版記念サイン会”
    set aText to body
  end tell
end tell

set a1Text to repChar(aText, “<br>”, return) of me
set a1Text to repChar(a1Text, “<div>”, return) of me
set a1Text to repChar(a1Text, “ ”, return) of me
set a1Text to detagText(a1Text) of me

a1Text
–>
(*
伊集院光 「ファミ通と僕」出版記念サイン会
新宿紀伊国屋書店本店 2巻同時予約した場合にかぎり、先着300名に整理券を配布
整理券の配布7/31 10:00本店2Fなくなり次第終了

整理券と引き換えで本2冊サイン本
サイン本には本人の名前を入れる
*)

–てきとーにタグを外す
on detagText(allText)
  repeat
    if (allText contains “< ") and (allText contains “>”) then
      set sOffst to offset of “< " in allText
      
set eOffst to offset of “>” in allText
      
      
set aTag to text sOffst thru eOffst of allText
      
      
set allText to repChar(allText, aTag, “”) of me
    else
      return allText
    end if
  end repeat
end detagText

–文字置換ルーチン
on repChar(origText, targStr, repStr)
  set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr}
  
set temp to text items of origText
  
set AppleScript’s text item delimiters to repStr
  
set res to temp as text
  
set AppleScript’s text item delimiters to txdl
  
return res
end repChar

–offset命令の実行を横取りする
on offset of searchStr in str
  set aRes to getOffset(str, searchStr) of me
  
return aRes
end offset

on getOffset(str, searchStr)
  set d to divideBy(str, searchStr)
  
if (count d) is less than 2 then return 0
  
return (length of item 1 of d) + 1
end getOffset

on divideBy(str, separator)
  set delSave to AppleScript’s text item delimiters
  
set the AppleScript’s text item delimiters to separator
  
set strItems to every text item of str
  
set the AppleScript’s text item delimiters to delSave
  
return strItems
end divideBy

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