見出し画像

チャネルトークのスニペットからasanaを作る バージョンアップ編

こんにちはtmdです。
過去に「チャネルトークとほかのツールと連携したい(スニペット・asana編)」というのと書いていたのですが、追加オーダーがあったのでまた記事を書きました。

追加オーダーについて

こんな感じの追加機能のオーダー入りました。

  1. タスクのコメントに注意書きを足してほしい

    1. トークンが私が発行したものなので作成者がtmdになってしまうが、自動作成だよ、という表示が必要。

    2. 説明じゃなくコメントのほうが見てるため。

  2. タスクの期日を足してほしい。当日付で良い

  3. asana側の担当者が作成時に既に決まっている場合はスニペットで選べるようにしてほしい

  4. カスタムフィールドを選択させてほしい

やったこと

注意書きの追加

どうやらタスクのコメントは「ストーリー」というらしい。
APIリファレンスを「コメント」で探していて、全然見つからな過ぎてフォーラムの英語をGoogle翻訳で読み漁って見つけた次第。

こちらが見つけたAPIリファレンス

function taskComments(storyGid,asanaAPIKey) {
  var url = "https://app.asana.com/api/1.0/tasks/"+storyGid+"/stories";
  var options = {
    "method": "POST",
    "headers": {
      "accept": "application/json",
      "content-type": "application/json",
      "Authorization": "Bearer " + asanaAPIKey
    },
    "payload": JSON.stringify({data: {text: '作成者が「tmd」なのは自動作成だよ'}})
  };
  var response = UrlFetchApp.fetch(url, options);
  var responseData = JSON.parse(response.getContentText());
  return;
}

これで、書き込むタスクのGidとAsanaのAPIを渡せば定型文で「作成者が「tmd」なのは自動作成だよ」とコメントが追加されます。

Gidは前回やったときにタスクの作成で作った以下のコードの中に含まれています。

asanaManager.createTask(objTask)

そのため、例えば以下のように呼び出すとgidが呼び出せます。

//変数に入れる
asanaTaskGet = asanaManager.createTask(objTask)
//gidを引っ張り出す場合このように書く
asanaTaskGet["gid"]

期限の追加

前回作ったコードに対してこんな感じで日付に関する行を書き足すと作成日付けの期日でタスクが作成できます。

var today = new Date();
var todayStr = Utilities.formatDate(today, 'JST', 'yyyy-MM-dd');
const objTask = {
    "data": {
      "workspace": workspaceId,
      "projects": [projectId],
      "name": name,
      "notes": planText,
      "due_on": todayStr,
    };
  };

担当者の追加・カスタムフィールドの追加

Asanaから担当者とカスタムフィールドを取得し、スニペットに表示します。
スニペットを使う際はプルダウンから該当する項目を選択して実行することでAsanaに希望するチケットが作成できる仕組みです。

データを取得するコードを書く
以下のこの関数を呼び出すためのコードをスニペットを表示する際の序盤に配置しておく

■呼び出す部分のイメージ

 var custamFieldData = asanaCustomfieldGet(customfieldId,asanaAPIKey)
 var asanaUserid = asanaUseridGet(asanaAPIKey)

■カスタムフィールドの取得
カスタムフィールドはフィールドごとに異なるIDを持っていますので処理の前に調べておきましょう。

function asanaCustomfieldGet(customfieldId,asanaAPIKey) {
  var options = {
    'method': 'get',
    'contentType': 'application/json',
    'headers': { 
     'Authorization': 'Bearer ' + asanaAPIKey
    };
  };
  var responseCustom = UrlFetchApp.fetch('https://app.asana.com/api/1.0/custom_fields/'+customfieldId, options);
  var resultCustom = JSON.parse(responseCustom);
  var list = [];  
  if(resultCustom.data){
  for(var i = 0; i < resultCustom.data['enum_options'].length; i++){
    if(resultCustom.data['enum_options'][i]['enabled']){
      list.push(resultCustom.data['enum_options'][i]['gid']);
      list.push(resultCustom.data['enum_options'][i]['name']);
      };
    };
  };
  return list;
};

■担当者(ユーザー)の取得

function asanaUseridGet(asanaAPIKey) {
  var options = {
    'method': 'get',
    'contentType': 'application/json',
    'headers': { 
     'Authorization': 'Bearer ' + asanaAPIKey
    };
  };    
   var response = UrlFetchApp.fetch('https://app.asana.com/api/1.0/users', options);
  var result = JSON.parse(response);
  var list = [];  
  if(result.data){
    for(var i = 0; i < result.data.length; i++){
        list.push(result.data[i]['gid']); 
        list.push(result.data[i]['name']); 
    };    
  };
  return list;
};

スニペットの表示部分を作る
同じようなコードなので、担当者の場合で記載。

■プルダウンにするために値を整理する

  var managerDrop= [];
    count1 = 0
    for (i=0;i<(asanaUserid.length)/2;i++){
      managerDrop.push({
       "id": asanaUserid[count1], 
       "label": asanaUserid[count1+1]
    });
    count1 = count1+2
   };

■プルダウンにする

{
 "id": "title",
 "type": "text",
 "text": "担当者名",
 "style": "h3"
},
{
 "type": "dropdown", 
 "id": "chatdropdownUser",
 "label": "text above the option", 
 "value": "default option id", 
 "disabled": false,
 "items":managerDrop
},

書き込む部分を作る

カスタムフィールドとユーザーの行をそれぞれ追加したのが以下のコードです。カスタムフィールドはフィールドごとに異なるIDを持っていますので、[]で囲って左側に記載することになります。

    var objTask = {
      "data": {
        "workspace": workspaceId,
        "projects": [projectId],
        "name": asanaTitle,
        "notes": planText,
        "due_on": todayStr,
        "assignee": { "gid": userId, "resource_type": "user" },
        "custom_fields": {
          [customfieldId] : chatdropdown
        };
      };
    };

※注意
カスタムフィールドと担当者は必ず埋まってる前提で書いてます。
そのため未選択時の回避の記述はどこかに必要なはずです。

そのほか

都度Asanaから必要情報を呼び出すと結構呼び出し時間が長くなるのが難点ですね。キャッシュなどで保存したほうがよいのか悩ましいところです。

ということで、それではまた会いましょう。


この記事が気に入ったらサポートをしてみませんか?