やりたいこと
先行タスクで得た情報を後続のタスク担当者に自動連絡する方法を考えてみました。
Script Actionなしでも以下の方法で対応できそうですが、運用に工夫が必要です。
- 先行タスクが完了すると後続タスクの担当者にブロック解除が通知される
- 「タスクのブロックが解除されたとき」をトリガとするルールでコメントする
「先行タスクを開いて確認しに行く」という運用の工夫を避けるため、Script Actionの利用を考えました。
考えた方法
先行タスク完了時、Script Actionを利用して後続タスクに先行タスクの説明の内容をコメントする処理を考えました。
- タイミング:(先行)タスクが完了した時
- 条件:タスクが特定のセクションにあるとき
(ここはScriptAction実行用のプロジェクトで利用するために設定) - 実行アクション:Script Actionで後続タスクに先行タスクの説明をコメントする
運用する際の利用手順
実際に運用する際には以下の流れを考えました。
- 先行タスクの説明に必要な情報を入力して完了させる
- 先行タスクの完了をトリガに自動で後続タスクにコメントする
作成したコード
以下のコードを作成しました。
async function run() {
//タスク情報を取得する際に出力するパラメータを指定する
const taskOpt = {
'opt_fields': "gid,name,description,dependents,html_notes"
};
// 現在のタスク情報を取得(後続タスクを含む)
const task = await tasksApiInstance.getTask(task_gid,taskOpt );
// タスクからHTML形式の説明文を取得
const srcHtmlNotes = task.data.html_notes;
//正規表現を利用して<hr>(水平線)以降の説明をコピー(水平線がない場合はすべてコピー)
var htmlTextRegexp1 = /^\<body\>((.|[\r\n])*)\<hr\s*\/?\>((.|[\r\n])*)\<\/body\>$/i;
//追加する説明変数を初期化
let addHtmlText = '';
//正規表現を利用して現在のタスクの説明から<hr>(水平線)以降の情報を取得
const match1 = srcHtmlNotes.match(htmlTextRegexp1);
//上記パターンに合致した場合、追加する説明変数に情報を格納
if(match1 !== null){
addHtmlText = match1[3];
}
//コメント文を作成
let body = {"data": {"html_text": "<body>先行タスクの情報を連絡します。\r\n\r\n先行タスクの情報:\r\n" + addHtmlText +"</body>"}};
// 後続タスクにコメント追加する
for (let nextTask of task.data.dependents) {
//コメントを追加
storiesApiInstance.createStoryForTask(body, nextTask.gid)
}
}
// To function properly, the script must end with returning a Promise via run().
run();
躓いた点その1:コメントに<body>~のようにタグ付きテキストで出力される
原因はhtml_noteに未対応のHTMLタグが入っていたためでした。
html_noteは<br> (HTMLの改行タグ)のような未対応のHTMLタグがあると、安全のためタグ付きで出力するようです。
詳細はAsana DevelopersページのRich textに記載がありますが、対応済みのタグを利用することのほかにXML形式である必要があり、大文字小文字も一致する必要があります。
なお、改行は文字列に\r\nと入力することで対応しました。
躓いた点その2:プロジェクトテンプレートからプロジェクトを作成すると、Script Actionが初期のコードになる
プロジェクトテンプレート内のルールのScript Actionを編集した後、テンプレートからプロジェクトを作成したところ、Script Actionのコードまではコピーされず初期のコードが入った状態になっていました。
セキュリティの関係でこうなっていると思うのですが、プロジェクトテンプレートではスクリプトアクションを利用できない方が安全だと思いました。
とはいえ「カスタムアクション実行用のプロジェクトを作成しておき、マルチホーム機能で自動でタスクを共有すること」で自己解決したので、大きな問題にはならずにすみました。
なお、以下のページにも同じ相談が書いてありました。