こんにちは。那須野です。
今回は、引き出し日記という「簡単に呟きをプライベートに記録して後から簡単に検索できる日記アプリ」で今まで書いてきた呟きメモを、Notionに移行したときの作業の流れを、備忘録としてまとめます。
引き出し日記は、iOSやAndroidで使える日記アプリです。
X(旧Twitter)みたいな感じに簡単に呟くことができて、それを高速に検索できるアプリです。無料でも十分に使うことができて、いつ何をやったかの記録を取っていました。とりわけ
みたいなものを検索して調べるのに便利で使っていました。データは端末自体に保存されるので、PCやブラウザで見ることはできませんが、代わりにとにかく高速で検索できるところがポイントです。無料の範囲内で十分に使えるのもポイントが高いです。
なお、X(旧Twitter)との違いは、完全にプライベートであること。自分しか見られないので、家庭のことでも何でも自由に書くことができます。ちなみに画像もアップロードできるのですが、私はテキスト一辺倒で使っていました。
引き出し日記自体に不満があったわけではないのですが、今回はNotionに移行しようという決断をしました。問題は、プライベートの情報が散らばりすぎていたことです。
具体的にどうなっていたかというと、タスク管理はAsana、カレンダーはYahooカレンダー、フロー的な情報管理は引き出し日記、ストック的な情報管理はNotionやGoogleスプレッドシートなどと色々なアプリを使っていたのです。
そういった状態の中、過去に何をやったか調べようとするとまず引き出し日記で検索してみるのですが、引き出し日記に何でもかんでも網羅的に入力しているわけではなく、ちょっとしたTODOや予定的なものはAsanaやYahoo!カレンダーにだけ入っていることが多いため、引き出し日記を検索しても出てこない。「あれ、どのアプリで入れてたっけな…?」となります。
引き出し日記は2年ほど使っており、それくらい長い期間になってくると、昔のことをどのアプリに入力していたかパッと思い出せないことが増えてきます。2年でコレなので、これ以上この状況を続けていたら今よりもっと不便な未来がやってくることは想像に難くありませんでした。
なるべく一つにまとめたいと考えたときに、選択肢として挙がったのがNotionでした。すでにストック的な情報をまとめるのには使っていましたし、ビジネス用途ではあらゆる情報をNotionに集約する使い方が色々あるのは分かっていたので、これならイケるだろう、と。
Notionは自由にデータベースを作れるので、日記用にデータベースを作ります。引き出し日記から移行したいデータの形式は
の2カラムでよいので、この2カラム+αでデータベースを作っておきます。その後、引き出し日記からデータをエクスポートし、データを成形してCSVファイルとして保存したうえで、Notionにインポートすれば移行完了になります。
それではステップごとに見ていきましょう。
引き出し日記のデータを出力するにはテキストでのバックアップ機能が必要ですが、実はこれはプレミアムプランが必要になります。
なお、2024年8月現在、プレミアムプランは最初の7日間が無料なので、もしプレミアムプランを利用していない場合は、移行するためにプレミアムプランを購入し、作業が終わったら課金される前に可及的速やかに解約すれば大丈夫です。
さて、テキストファイルとしてエクスポートしたファイルは、以下のような形式でした…。
2024-08-17
10:19 ********************************************
13:18 **********************
13:22 **********************
23:25 **********************
**********************2024-08-18
12:01 **********************
18:45 **********************
もちろん実際の呟きはアスタリスクで隠していますが、ここから分かることとしては、
CSVファイルであればExcelで手作業で加工することもできましたが、こうなると簡単には加工できません。2年分と量も多いので、もちろん手動でやるなど考えられません。しょうがないので、Excel VBAでデータを成型するコードを書いて処理することにしました。
Excel VBAで処理できるようにするために、Excelファイルを開き、Sheet1のA列のセルの表示形式を「文字列」に変換したうえで、テキストファイルの値をA列にそのまま貼り付けます。
ちなみに「文字列」に変換しておくのは、日付テキストしかない日付行が勝手に日付型として認識されて値変換されるのを防ぐためです。
以下のようなコードを書いて、さっそく実行しましょう。成形されたデータが新しいシートとして生成されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
Option Explicit Sub convertData() Dim inputSheet As Worksheet, inputCells As Range, inputText As String, inputRow As Long Dim outputSheet As Worksheet, outputCells As Range, outputRow As Long, outputDate As String, outputTime As String, outputText As String, tempOutputText As String Dim blankRowCount As Long, maxBlankRowCount As Long 'インプットの定義 Set inputSheet = Worksheets("Sheet1") Set inputCells = inputSheet.Cells 'アウトプットの定義 Set outputSheet = ActiveWorkbook.Worksheets.Add Set outputCells = outputSheet.Cells 'アウトプットシートのヘッダー定義 Range(outputCells(1, 1), outputCells(1, 2)).Value = Array("名前", "日付") '日付行を検出する正規表現 Dim isDateRow As Object Set isDateRow = CreateObject("VBScript.RegExp") isDateRow.Pattern = "^20\d\d-\d\d-\d\d$" '時間行を検出する正規表現 Dim isTimeRow As Object Set isTimeRow = CreateObject("VBScript.RegExp") isTimeRow.Pattern = "^(\d\d:\d\d )" 'インプットシートを上から走査してアウトプットシートに転記する。空白行が5行を超えたら終了とする inputRow = 1 outputRow = 1 blankRowCount = 0 maxBlankRowCount = 5 Do inputText = inputCells(inputRow, 1).Value '日付行なのでinsert確認したうえで、初期化しつつ日付だけセット If isDateRow.test(inputText) Then Call checkAndInsertRecord(outputDate, outputTime, outputText, outputCells, outputRow) outputDate = Format(CDate(inputText), "yyyy年m月d日") 'yyyy年m月d日で出力 outputTime = "" outputText = "" blankRowCount = 0 '時間行なのでinsert確認したうえで、時間とテキストをセット ElseIf isTimeRow.test(inputText) Then Call checkAndInsertRecord(outputDate, outputTime, outputText, outputCells, outputRow) outputTime = IIf(Left(inputText, 1) = "0", Mid(inputText, 2, 4), Left(inputText, 5)) 'h:nnで出力 outputText = Mid(inputText, 7, 9999) blankRowCount = 0 '空白行なので、スキップする ElseIf inputText = "" Then blankRowCount = blankRowCount + 1 '改行後に続くoutputTextなので、直前の空白行を意識しつつテキストに足す Else outputText = outputText & repeatString(vbNewLine, blankRowCount + 1) & inputText blankRowCount = 0 End If If blankRowCount > maxBlankRowCount Then Call checkAndInsertRecord(outputDate, outputTime, outputText, outputCells, outputRow) Exit Do End If inputRow = inputRow + 1 Loop MsgBox "Finished with " & (outputRow - 1) & " output rows!" End Sub 'レコードを出力できるか確認のうえ、できるならそのまま出力する関数 Sub checkAndInsertRecord(ByVal outputDate As String, ByVal outputTime As String, ByVal outputText As String, ByRef outputCells As Range, ByRef outputRow As Long) If outputDate <> "" And outputTime <> "" And outputText <> "" Then outputRow = outputRow + 1 Range(outputCells(outputRow, 1), outputCells(outputRow, 2)).Value = Array(outputText, outputDate & " " & outputTime) End If End Sub '文字列を指定個数だけ並べて返す関数 Function repeatString(ByVal str As String, ByVal n As Long) As String Dim result As String, i As Long result = "" For i = 1 To n result = result & str Next i repeatString = result End Function |
出来上がった新しいシートをUTF-8のCSVファイルとして保存します。
Notionのデータベースを開き、右上のメニューボタンから「CSV取り込み」を選択し、保存したCSVファイルを選択して「開く」ボタンを押します。自動的にすべてのデータが取り込まれて完了です。
なお、失敗して変にインポートされてしまうと巻き戻せないので、テスト用に複製したデータベースに対して試しにインポートして、問題なければ本番のデータベースに対して取り込みを行いましょう。
今回は2列だけ、しかも実質的に文字列を放り込むだけのデータの取り込みだったので割と簡単にできました。これだけ取り込みやすいなら、Notionは他のアプリやサービスからのデータ移行も簡単にできそうですね。
ちなみに…Asanaについては本当に雑多なデータが多かったので、必要なTODOだけを手動で転記しました。数が限られるので、もうエイヤでやりました。なお、Yahoo!カレンダーについてはUI的に圧倒的に便利なので引き続き使っていきますが、うまい統合の仕方ができないかは引き続き考えていきます。
これでだいぶNotionに寄せられたので、これからはちゃんとNotionに記録していって、Notionを検索したらだいたい何か出てくるようにしていきたいと思います。
追伸:引き出し日記は、単一のアプリとしては本当に簡単に記録できて簡単に検索できて使いやすいので、気になる方は是非お試しください。