Milkscript ノートの内容からサブタスクを作成。サブタスクを一括削除し、内容をノートに転記する
公開 2023/11/21 13:57
最終更新 2023/12/11 11:24
引き続きMilkScriptのコードを載せていきます。

ノート → サブタスク #

ノートの内容からサブタスクを追加していくスクリプトです。

こちらも公式にある『Tasks from note』というスクリプトを自分の使いやすいようにアレンジしたものです。

スクリプト実行前 #

以下のように選択しているタスクのノートに追加したいサブタスクを書き記し……


スクリプト実行後 #

スクリプトが実行されると、当該タスクのサブタスクとして追加される。という仕組みです。


スクリプト #

// 選択タスクの最新ノートの内容から、サブタスクを作成(スマートアドに対応)
if (rtm.getSelectedTasks().length !== 1){
  throw new Error("タスクが選択されていない、または複数タスクが選択されています");
}
const [selectedTask] = rtm.getSelectedTasks();

// 定数『note』に選択タスクの中で最新ノートを格納
const note = selectedTask.getNotes()
  .reduce((result, note) =>
    result == null || note.getModifiedDate() > result.getModifiedDate() ?
      note : result, null);
if (note == null) {
  throw new Error("選択されたタスクにノートがありません");
}

// noteを改行ごとに分割
const context = note.getContent().split('\n');

// サブタスクを追加。字下げされていたら、孫タスクとして追加する
let parent = selectedTask.getName();
context.forEach(line => {
  if (!line.match(/^[\s\t]+/)) {
    parent = formatTaskName(line);
    selectedTask.addSubtask(parent,true);
  } else {
    const [parentTask] = selectedTask.getSubtasks(parent);
    parentTask.addSubtask(formatTaskName(line,true));
  }
})

// 箇条書きの冒頭からスペースとハイフンをトリムする
function formatTaskName(text) {
  const match = text.match(/^([-\s]+)/);
  const stCount = match ? match[0].length : 0;
  return text.slice(stCount);
}

選択タスクが0、または複数ある場合はエラーになります。
また選択中のタスクにノートがない場合もエラーとなります。

最後に更新されたノートの情報が取得されます。

使い方 #

私はよくMarkDown記法を使ってノートアプリにプロジェクトの大雑把なプランや、ざっくりやること、経過などをメモしていくのですが、その一環でタスクをMarkDown形式で細分化して書いていきます。

それをいざタスク管理アプリ『remember the milk(以下RTMと表記)』に登録する際、ちまちまコピペするよりスクリプトで一気に登録できたら便利だな……と、コードを書いてみました。

公式で公開されているコードをそのまま使ってもいいのですが、自分の中でMilkScriptの理解度を深めるため書いたものです。

あと冒頭の『- 』はトリムされます。
字下げされていれば、孫タスクとして追加されます。……が、挙動がイマイチで、たまに意図しない動きをします。



サブタスク → ノート #

上記スクリプトの逆バージョンです。
選択中のタスクの中のサブタスクを、ノートに箇条書きするためのスクリプトです。

スクリプト実行前 #



スクリプト実行後 #



スクリプト #

if (rtm.getSelectedTasks().length !== 1){
  throw new Error("タスクが選択されていない、または複数タスクが選択されています");
}
// 定数『selectedTask』に選択タスクを格納する
const [selectedTask] = rtm.getSelectedTasks();
if (selectedTask.getSubtasks().length === 0) {
  throw new Error("選択されたタスクにサブタスクがありません。");
}

// 選択されたタスクにあるサブタスクを取得する
const subtasks = selectedTask.getSubtasks();

// 二次元配列にタスクとタグ、締切を格納
const data = [];
for (let i = 0; i < subtasks.length; i++) {
  const name = subtasks[i].getName();

  const tags = subtasks[i].getTags().flatMap(tag => tag.getName());
  const tagNames = subtasks[i].getTags().length > 0 ? '#' + tags.join(' #') : ``;
  
  const due = subtasks[i].getDueDate();
  const dueString = due ? '^' + due.toISOString().substring(0, 10) : '';

  const row = [name, tagNames, dueString];
  data.push(row);
}

// 二次元配列をタスク名でソートする
data.sort(function(a, b) {
  const nameA = a[0].toUpperCase();
  const nameB = b[0].toUpperCase();
  
  let comparison = 0;
  if (nameA > nameB) {
    comparison = 1;
  } else if (nameA < nameB) {
    comparison = -1;
  }
  return comparison;
});

for (let j = 0; j < data.length; j++) {
  selectedTask.getSubtasks().forEach(task => {
    if(task.getName() === data[0,j][0,0] && task.getSubtasks().length > 0) {

      task.getSubtasks().forEach( subtask => {

        const tags = subtask.getTags().flatMap(tag => tag.getName());
        let tagNames = '';
        if (subtask.getTags().length > 0){
          tagNames = '#' + tags.join(' #')};
    
        const due = subtask.getDueDate();
        const dueString = due ? '^' + due.toISOString().substring(0, 10) : '';

        const subData = [' ' + subtask.getName(),tagNames,dueString]
        data.splice(j+1,0,subData);
      });
    }
  });
}

// 配列から文字列変数へ
let context = '';
data.forEach(data => {
  context = context + data + '\n';
});

context = context.replaceAll(',',' ');

// サブタスクを文字列変数『context』に格納し、ノートを作成する
selectedTask.addNote(context);

// 選択したタスクからサブタスクを削除する
// selectedTask.getSubtasks().forEach(subtask => subtask.delete());

選択タスクが0、または複数ある場合はエラーになります。
また選択中のタスクにサブタスクがない場合もエラーとなります。

サブタスクはあいうえお順にてソートされます。

自分で使っているコードでは、ノートに転記後、サブタスクは一括削除しているのですが、ここで紹介しているコードでは念のため削除にあたる部分をコメントアウトしています。

動作確認後、大丈夫と思ったらコメントアウトを解除して使ってください。

使い方 #

当初、計画していたタスクに狂いが生じた時に、一旦取り下げしたくてサブタスク群を削除したい場合、後からどんなことをしようとしていたのか振り返りに使うためのものです。

また最初に紹介した『ノート → サブタスク』を実行すれば、またサブタスクに戻すことができます。

スマートアドには、タグ(#)と締切日(^)にのみ対応しています。
北海道在住の四十路OL主婦です。
最近の記事
WordPressから撤退
BrownDots(http://browndots.net)という名前のブログを書いていました。 しかし更新が滞ったまま数年が経ち、このたび撤退した…
2025/01/01 16:52
Excel VBAメモ: コレクションを使ってオートフィルタした値を重複なく配列に格納する方法
オートフィルタしたあとのデータから重複なく可視セルの値を配列に格納する方法のメモです。 Sub オートフィルタした値を重…
2024/05/23 15:21
自己紹介
北海道帯広在住。44歳。女。既婚。子は独立済み。 商業高校卒。中小企業の事務歴26年。2020年 働きながら放送大学卒業。…
2024/05/21 10:16
MilkScriptでプロジェクトレポートと、年次レビュー用タスクリストを取得する
MilkScriptに関する記事は、これで最後です。 今回も条件を指定してタスクリストを取得し、ウィンドウ表示させるといったもの…
2023/12/10 20:06
MilkScriptで週次レビュー用やったことリストや月次レビュー用やったことリストを表示する
引き続き、これまでに書いたMilkScriptの紹介です。 前回もそうですが、この記事も、この次の記事もずっと「完了したタスクをウ…
2023/12/05 13:07
MilkScriptで日報用やったことリストを取得し、選択タスクのノートをすべてウィンドウ表示させる
引き続きこれまでに書いたMilkScriptの紹介です。 日報用やったことリスト # とある備忘録だけ集めたリストに『ジャーナル…
2023/11/27 18:28
Milkscript ノートの内容からサブタスクを作成。サブタスクを一括削除し、内容をノートに転記す…
引き続きMilkScriptのコードを載せていきます。 ノート → サブタスク # ノートの内容からサブタスクを追加していくスクリ…
2023/11/21 13:57
MilkScriptを使ってタスク名の冒頭にキーワードを付与する
これからタスク管理アプリ『remember the milk(以下RTMと記述)』独自のスクリプトについて、いくつか使っているコードを紹介し…
2023/11/20 13:29
テストポスト
大見出し # てすとてすと。 あいうえお、かきくけこ。あいうえお、かきくけこ。あいうえお、かきくけこ。あいうえお、かきく…
2023/08/10 10:23
もっと見る
タグ
MilkScript(5)
ExcelVBA(1)
もっと見る