MilkScriptで日報用やったことリストを取得し、選択タスクのノートをすべてウィンドウ表示させる

引き続きこれまでに書いたMilkScriptの紹介です。

日報用やったことリスト

とある備忘録だけ集めたリストに『ジャーナル』というタスクがあるのですが、ここに『0101』『0102』など日付ごとのサブタスクを365日分作って、ノートにその年ごとの食べたものや、起こった出来事などを日記的につけています。

ここに追加する『その日、完了させたタスクのリスト』をウィンドウ表示させるためのスクリプトです。

最新ノートの一行目で日付判断をしていますが、もしそこから情報が得られない場合は今年の西暦 + タスク名で検索することとします。

スクリプト実行前

スクリプト実行後

スクリプト


if (rtm.getSelectedTasks().length !== 1) {
    throw new Error("タスクが選択されていない、または複数タスクが選択されています");
    }
    const [selectedTask] = rtm.getSelectedTasks();
    
    // 選択タスクが数値4桁だったら実行される。
    if (/^\d{4}$/.test(selectedTask.getName())) {
        // ノートの内容から日付を取得。エラーだったらタスク名 + 今年の西暦
        const note = selectedTask.getNotes()
        .reduce((result, note) =>
            result == null || note.getModifiedDate() > result.getModifiedDate() ?
            note : result, null);
        if (note === null) {
            throw new Error("選択されたタスクにノートがありません");
        }
    
        const [context] = note.getContent().split('\n');
    
        const hasYYMMDD = /^\d{6}/.test(context);  // contextの先頭6文字が数値だったらtrue
        const date = formatDatefromYYMMDD(hasYYMMDD ? context.slice(0, 6) : new Date().getFullYear().toString().slice(-2) + selectedTask.getName());
    
        const completedDate = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`
    
        // その日、完了させたタスク一覧をメッセージ表示させる。
        const completedTasks = rtm.getTasks(`status:completed AND completed:${completedDate} AND NOT list:CheckList`)
            .sort((a, b) => a.getCompletedDate() - b.getCompletedDate());
        const taskList = [
            `### 完了タスク: ${completedTasks.length}\n`,
            ...completedTasks.map(task => `- ${task.getName()}\n`)
        ];
        
        rtm.newFile(taskList.join(``), rtm.MediaType.TEXT, 'RTM_Tasklist.txt');
    }
    
    // yymmdd形式を日付に変換
    function formatDatefromYYMMDD(yymmdd) {
        const year = Math.floor(yymmdd / 10000) + 2000;
        const month = Math.floor((yymmdd % 10000) / 100);
        const day = yymmdd % 100;
    
        return new Date(year, month - 1, day);
    }
                    

ここで取得したやったことリストを、その日のノートの最後にコピペして記録しています。

自動で当該ノートに追記させる方法もあるな……と、今、このエントリーを書きながら思いました。
そのうち、実装できたらまた改良版をここに記したいと思います。

ジャーナルエクスポート

上記のジャーナルですが2019年から開始しており、だいぶデータが溜まってタスクを選択するだけで数秒時間を要するようになってしまいました。

また、いつかサービスが停止された時に、これまでのデータがチリに消えてしまうのも惜しい。

そこで、これまでのジャーナルを一括でどこかに退避するよう作ったスクリプトです。

選択したジャーナルタスクのすべてのノートをウィンドウ表示させます。

スクリプト実行前

スクリプト実行後

ウィンドウの大きさの都合上、2022年のジャーナルしか表示されていませんが、この下に2021、2020、2019年のジャーナルもちゃんとあります。

スクリプト


if (rtm.getSelectedTasks().length !== 1) {
    throw new Error("タスクが選択されていない、または複数タスクが選択されています");
    }
    const [selectedTask] = rtm.getSelectedTasks();
    // 選択中のタスクにあるノートを作成日の古い順から下にウィンドウ表示。
    // ノート区切りは『---』、1行目に『## 』を付加する。
    const note = selectedTask.getNotes()
        .sort((b, a) => a.getCreatedDate() - b.getCreatedDate());
    
    
    const context = [
    ...note.map(note => `## ${note.getContent()}\n\n---\n\n`)
    ];
    // 最後の行だけは改行と区切り線『---』を抜く
    const num = context.length - 1;
    context[num] = context[num].slice(0, context[num].length - 7);
    
    rtm.newFile(context.join(``), rtm.MediaType.TEXT, selectedTask.getName()+'.md');
                    

今は選択したタスクの全てのノートをウィンドウ表示させるだけですが、今後は『複数選択したタスクの2019年の分だけ吸い上げる』とかできるようになったら便利かもしれないな。……と、思っております。

これも、そのうち実装できたらここに載せたいです。


このジャーナルはなくても日頃のタスク管理にはまったく影響ないんですが、去年の今頃何してた……とか、結婚前にこんなことしてたんだ。とか娯楽的な楽しみ方ができてとても良いです。

ただRTMに負荷がかかっているようなので、他のノートアプリへエクスポートしていきたいと思っています。