ルールのスクリプトを使って完了していないサブタスクがあれば親タスクを未完了にする

密かにリリースされていたルールのアクション、run scriptをつかって、親タスクを完了させた時に、完了していないサブタスクがあれば、親タスクを未完了に戻すルールを作ってみました。

なお、run scriptはenterprise以上でないと使えません。

今回使う言語はjavascriptということで、asanaのAIに以下のように聞いて、スクリプトの叩き台を作ってもらいました。

ルールのscriptアクション用のプログラムを描きたいです。トリガーしたタスクのサブタスクの完了状態を確認して、一つでも未完了のサブタスクがあれば、トリガーしたタスクを未完了にするコードを書いてください。

出力されたコードは以下のようになりました。

// トリガーしたタスクのGIDを取得
const taskGid = context.task.gid;

// サブタスクを取得
const subtasks = await asana.tasks.getSubtasks(taskGid);

// サブタスクの完了状態を確認
let allSubtasksCompleted = true;
for (const subtask of subtasks.data) {
  // サブタスクの詳細情報を取得
  const subtaskDetails = await asana.tasks.getTask(subtask.gid);
  
  // 未完了のサブタスクがあるかチェック
  if (!subtaskDetails.completed) {
   allSubtasksCompleted = false;
   break;
  }
}

// 未完了のサブタスクがある場合、親タスクを未完了に設定
if (!allSubtasksCompleted && context.task.completed) {
   await asana.tasks.updateTask(taskGid, {completed: false});
}

このままでは動かなかったのでデバッグをして、以下のようなコードを完成させました。

/**
* What's in scope?
* 1. (string) project_gid, workspace_gid, task_gid (only if triggered on a task)
* 2. (function) log - this behaves like console.log and takes any number of parameters
* 3. (object) *ApiInstance - for each group of APIs, an object containing functions to call the APIs; for example:
*    tasksApiInstance.getTask(...)
*    goalsApiInstance.addFollowers(...)

* For more info, see https://github.com/Asana/node-asana
*/

async function run() {
  // サブタスクを取得
  const subtasks = await tasksApiInstance.getSubtasksForTask(task_gid);
  // サブタスクの完了状態を確認
  let allSubtasksCompleted = true;
  for (const subtask of subtasks.data) {
    // サブタスクの詳細情報を取得
    const subtaskDetails = await tasksApiInstance.getTask(subtask.gid);
    // 未完了のサブタスクがあるかチェック
    log(subtaskDetails.data.completed)
    if (!subtaskDetails.data.completed) {
      allSubtasksCompleted = false;
      break;
    }
  }
  
  // 未完了のサブタスクがある場合、親タスクを未完了に設定
  if (!allSubtasksCompleted) {
    let body = {
      "data":{
        "completed": false
      }
    }
    await tasksApiInstance.updateTask(body, task_gid);
  }
}

// To function properly, the script must end with returning a Promise via run().
run();

このコードを以下のようにスクリプトルールに貼り付けます。

今回は親タスクだけでルールを発動させたいので、サブタスクで実行のチェックは外しました。

普段使わない言語だったので、最初戸惑いましたが、asanaAIの叩き台コードとAPIのリファレンスと睨めっこしたら、比較的簡単に完成させることができました。
今回は、親タスクをトリガーにしましたが、サブタスクをトリガーにして、親タスクのカスタムフィールドを書き換えるなんてこともできそうですね!

みなさんの参考になると嬉しいです。

3 Likes