2012年1月8日

[Mac] Converting TapExpense reocrd to MacMoney by Automator

標題下得有點長,還真是不太好意思。由於我習慣使用兩款記帳軟體來處理個人帳務,一者是用 iPod 隨手記帳的 TapExpense 2(最近剛購買由接手團隊 Lazy Studio 製作的第二版),另外則是麥金塔上的 MacMoney。兩款都是相當好用的軟體,卻同樣沒有出雙平台的版本,因此我寫了個 Perl 語言的轉換器,好讓我能將 TapExpense的紀錄匯入 MacMoney 中。

任何一個方便的功能,往往都附帶一些條件,這就是彈性與便利性的取捨。例如你必須把 TapExpense的紀錄透過 Email 傳輸,再從 Email 複製記錄另存成為 input.csv,接著把input.csv 與轉換器 Core.pl 放在一起,最後透過終端機下指令,才能匯出MacMomey要的csv檔案(範例檔名為 Book.csv)。

perl Core.pl>Book.csv

由於記帳不是一天兩天的事情,每次都要做也挺麻煩,真希望能夠把 TapExpense 記錄檔扔進某個程式裡面就能夠自動產生 MacMoney 的匯入檔。今天把整個想法擬定一下,決定這就是個大概的流程。


構思流程

TapExpense → 存成任意文字檔 → 建立 Booking 資料夾 → 設定資料夾動作 → Automator → 將文字檔命名為 input.csv → 利用 AppleScript 下命令給 Terminal 在桌面產生 book.csv → 刪除扔進資料夾的文字檔 → 把 book.csv 匯入 MacMoney 即可。


改良版的 TapExpense2MacMoney 轉換器 - Core.pl下載
$file = 'input.csv';
open (F, $file) || die ("Could not open $file!");
while ($line = <F>)
{
($field1,$field2,$field3,$field4,$field5,$field6,$field7,$field8) = split ',', $line;
#分開各欄數值
$field3 =~ s/-//;
#取代負號
$result = "20$field1,$field4,$field5,$field3,$field8";
#補回西元成四位數
$result =~ s/20Date/Date/;
$result =~ s/?/,,/;
#取代標題誤植20
print $result;
}
close (F);


和先前不太一樣的部份在於我添加了一個奇怪形狀的問號,這是在 iPhone 中文輸入時可以打出來的符號,目的是讓我在記帳時,可以在備註欄位用「問號」來區隔購買項目與統一發票號碼,切割後會匯入到MacMoney的統一發票欄位中。老實說我還挺希望 TapExpense2 的團隊能夠增加統一發票的欄位,最近拿到一堆電子發票,購買時不輸入的話,事後整理也會很困難。


專屬的記帳資料夾

我這次會重新研究轉換器的想法,在於我不喜歡桌面上放著檔案,但每次都要在終端機輸入編碼的指令,把檔案放在桌面似乎是切換的最好方式,反正只需要輸入:
cd Desktop
這次我的想法是,將Mac的「檔案夾動作設定」功能發揮出來。當我扔一個新的檔案進去「記帳」資料夾時,檔案夾動作設定會自動將檔案重新命名為我要的「input.csv」,順便下達指令給終端機,把檔案直接存到桌面上讓我使用。

現在就讓我們建立一個資料夾,不妨就叫做「Booking」(簿記),當然你可以取任何喜歡的名字,為了讓程式運作順暢,我還是少用中文的好。有一點算破梗,如果你有使用 Hog Bay Software 推出的 PlainText ,另外還有使用 Dropbox 與你電腦同步的話,可以把「Booking」資料夾建在 Dropbox 的 PlainText 中,應該會不錯。

接著把 Core.pl 扔進 Booking 資料夾就算完成準備工作。


設定 Automator 動作



Automator 機器人之前使用過很多次,這邊我不妨再使用一次,機器人只需要執行兩項動作:重新命名、執行 ActionScript。動作很簡單,開啟 Automator,選擇建立 Folder Action,只需要透過簡單的拖曳就能夠拉出這兩個動作。

唯一要解釋的大概還是 AppleSctipt的部份,由於我對 AppleScript 不熟,只好用很土法煉鋼的方式。利用 Var1~Var3 三個變數,分別設定切換資料夾下指令要求轉檔刪除 input.csv

由於對終端機下命令實用的是 keystroke 指令,電腦會以打字的方式將指令逐字key進去,如果這時你的輸入法是中文輸入法,你就會看到一堆注音符號出現在終端機中,建議還是事先切換的好。

tell application "Finder" to get folder of (path to me) as Unicode text
set workingDir to POSIX path of result
set Var1 to "cd /Users/lifong/Documents/Booking"
set Var2 to "perl Core.pl>~/Desktop/book.csv"
set Var3 to "rm /Users/lifong/Documents/Booking/input.csv"
activate application "Terminal"
delay 0.2
tell application "System Events" to keystroke Var1
tell application "System Events" to keystroke return
delay 0.2
tell application "System Events" to keystroke Var2
tell application "System Events" to keystroke return
app "terminal" quit
try
do shell script Var3
end try


請將 /Users/lifong/Documents/Booking/ 替換成你的Booking 資料夾路徑

別忘了最上頭 "Folder Action recevies files and folders add to" 選擇你的 Booking 資料夾,儲存起來就行了。


實際跑一遍


你可以把 Booking 增加到 Finder 的側邊欄當中,開啟任意的文字編輯器,將 TapExpense 記錄儲存到 Booking 資料夾中,稍微等個兩三秒鐘就會見到終端機跳了出來,大約經過 0.5 秒的時間就會關閉(因為我有下 delay 0.2 指令),這時你應該可以看到 book.csv 出現在你的桌面上了。


哪裡破梗

還記得我事前說的嗎?整個記帳流程不光是下指令討厭,就連把帳務記錄從 TapExpense 寄到信箱再複製存成檔案也是個討厭的工作。剛巧 PlainText 這款文字編輯的App可以透過 Dropbox 同步,你能夠把帳務記錄直接貼到 PlainText ,等 Dropbox 同步時啟動資料夾動作設定,你就可以直接拿到 book.csv。

如果你有興趣,不妨用用看這個點子,稍微加以調整應該就會好用得很。