見出し画像

Macの本当に面倒なことはChatGPTにAppleScriptを出力させてやらせよう

事の発端 メモの特定フォルダにあるファイル群をひとまとめにしたい

Macのメモアプリ

Macのメモアプリにはいっている特定のフォルダのテキストファイル達を1つのファイルにまとめたい(連結したい)という作業が発生しました。

その日食べたものとカロリーが適当にまとめられているファイル達

今回のサンプルは上記のようなファイルですが、他にも
- 朝活のため朝起きた時間と外に出た時間を書いただけのファイル群
- 画像生成プロントのパターンをかいたファイル群
のようなものがあり1つのファイルにまとめてChatGPTにグラフ化してもらったり、画像生成プロンプトのパターン増幅につかったりしたいと思い至りました。

人間のやる作業じゃない😇

メモをコピーしてVSCodeで作成したファイルにはりつけて、「ーーーー」で区切り線をいれて、またメモからコピーして・・を10回ぐらい繰り返ししていくなかでさすがにこの行程の後ChatGPTでグラフ化なり生成プロント増幅というAIを使った事をやるのに、なぜこの途中行程でこんなにアホらしい作業をしないといけないのか?俺は本当に人間なのか?と思いはじめ自動化を模索しました。

余談:ソフトも探しましたがメモからファイル1つ1つをファイル生成するツールだったり、特定のフォルダのファイルをまとめるのには有料だったりしてなかなかメモから好きにデータを取り出すツールはなさそうでした。

Macには自動化ツールのAutomatorとAppleScriptという謎のマイナー言語が搭載されている


Macのアプリケーションの「その他」にAutomatorとスクリプトエディタ(AppleScript)という自動化ツールが搭載されています。
最初はAutomatorでメモ帳からVScodeに貼り付ける作業を自動化しようと頑張りましたがGUI->GUIの操作フローを作成するのが結構難易度高く、コツを掴むのに苦労しそうだったので今回はスクリプトエディタを使い、AppleScriptでファイルを作成し、そこにメモの内容を全部ぶちこむことにしました。

謎の言語AppleScriptを覚えて書くことはしたくないー>ChatGPT先生お願いします!


最初はGPT先生にAutomatorでのやり方を聞いてましたが複雑だったのでAppleScriptでやれないかを聞きました。

(私)
複雑なので単純なキー操作を記録して再現する形にしたいです メモをひらいてテキストをコピーし VScodeにはりつけて -- と書いて区切りをいれる またメモにもどって↑キーを押して新しいメモを開いてテキストをコピー 〜繰り返し 上記をApple Script?などMacのオートメーションツールで作成できませんか

(GPT先生)
はい、AppleScriptを使ってキー操作を記録し、テキストのコピーとペーストを自動化するスクリプトを作成することができます。以下に基本的なAppleScriptの例を示しますが、実際にスクリプトを実行する前に、お使いの環境に合わせて細かい調整が必要になる場合があります。

tell application "Notes"
    -- ノートのリストを取得する
    set noteList to name of notes
end tell

tell application "Visual Studio Code"
    activate
    -- 新しいファイルを開く
    tell application "System Events" to keystroke "n" using {command down}
    -- テキストをペーストする場所を確保
    tell application "System Events" to keystroke "v" using {command down}
end tell

repeat with theNote in noteList
    tell application "Notes"
        -- ノートを開く
        show note theNote
        -- テキストをコピー
        tell application "System Events" to keystroke "a" using {command down}
        tell application "System Events" to keystroke "c" using {command down}
    end tell
    
    tell application "Visual Studio Code"
        activate
        -- テキストをペースト
        tell application "System Events" to keystroke "v" using {command down}
        -- 区切りを挿入
        tell application "System Events" to keystroke "--"
        -- 改行を挿入
        tell application "System Events" to keystroke return
    end tell
end repeat

フォルダ階層の処理がなかったので追加してもらい、AppleScript内でファイルを作成する処理まで追加してもらいました。
なんとAppleScriptでファイルの作成までできるのです。

-- テキストファイルのパスを設定
set desktopPath to path to desktop folder as string
set theTextFilePath to desktopPath & "NotesContent.txt"

-- ファイルが存在しない場合は作成する
tell application "System Events"
	if not (exists file theTextFilePath) then
		set theTextFile to open for access file theTextFilePath with write permission
		write "" to theTextFile
		close access theTextFile
	end if
end tell

tell application "Notes"
	set fold1 to folder "食べたもの"
	set fold2 to folder "子フォルダ" of fold1
	set fold3 to folder "孫フォルダ" of fold2
	set noteList to notes of fold3
	
	repeat with theNote in noteList
		set theNoteContent to body of theNote
		
		-- テキストファイルにノートの内容を追加する
		tell application "System Events"
			set theTextFile to open for access file theTextFilePath with write permission
			write theNoteContent & "
--
" to theTextFile starting at eof
			close access theTextFile
		end tell
	end repeat
end tell

できたスクリプトを実行

スクリプトエディタで実行ボタンを押せば処理完了です👍

AppleScirpt内でUNIXコマンドを呼び出しさらに処理させる

画像生成プロントをまとめたファイルには、プロントと画像の組でメモに記録していたためこの処理だと画像ファイルはBase64で記録されてしまうので画像を切り離す必要があります、また画像を貼り付けた時点でメモがHTMLとして記録されるのでそれをどうにかする必要がありました。

(私)
スクリプトの中でtextutilコマンドを呼び出して変換するようにできませんか

(GPT先生)
AppleScriptから直接textutilコマンドを呼び出してHTMLをテキストに変換することができます。textutilはmacOSに組み込まれているコマンドラインツールで、様々なテキストフォーマットを変換するのに使われます。以下のスクリプトは、textutilコマンドを使ってHTMLコンテンツをテキストに変換し、それをテキストファイルに追記する方法を示しています。

略~
    repeat with theNote in noteList
        set theNoteContent to body of theNote
        
        -- 一時的なHTMLファイルを作成
        set tempHTMLPath to (path to temporary items folder as string) & "temp.html"
        set tempHTMLFile to open for access file tempHTMLPath with write permission
        write theNoteContent to tempHTMLFile
        close access tempHTMLFile
        
        -- textutilコマンドを使用してHTMLをテキストに変換
        set theTextContent to do shell script "textutil -convert txt " & quoted form of POSIX path of tempHTMLPath & " -stdout"
        
        -- テキストファイルにノートの内容を追加する
        tell application "System Events"
            set theTextFile to open for access file theTextFilePath with write permission
            write theTextContent & "
--
" to theTextFile starting at eof
            close access theTextFile
        end tell
        
        -- 一時的なHTMLファイルを削除
        do shell script "rm " & quoted form of POSIX path of tempHTMLPath
    end repeat
end tell


まとめ 面倒な作業の自動化そのものをChatGPT先生に聞こう

AutomatorやAppleScriptといった便利な自動化ツールがあるのは知っていたものの、それを習得する手間やトライアンドエラーのコストを気にしていままで使ってきませんでしたがChatGPTの登場によりやっと門戸が開いた気がします。むしろこの1連の流れの「会話で自動化ツールのスクリプトを出力する機能」をOSで標準で搭載してくれと思いました。
・・と思ったらWindowsのほうでは搭載するようなのでMacも早めに搭載してくれないかなーと思います。MacにOpenAI系が入ることが今のところないと思うので搭載されても精度が怪しいと思いますが。


この記事が気に入ったらサポートをしてみませんか?