密かにリリースされていたルールのアクション、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のリファレンスと睨めっこしたら、比較的簡単に完成させることができました。
今回は、親タスクをトリガーにしましたが、サブタスクをトリガーにして、親タスクのカスタムフィールドを書き換えるなんてこともできそうですね!
みなさんの参考になると嬉しいです。