AsanaとGoogle Apps Scriptを連携する

##Google Apps ScriptからAsana APIを呼んでみる。

メールが来たら、Asanaにタスクを立てるとか、Asanaのタスクを全部読んで報告シートを更新するとか、Google Apps ScriptからAsana APIを呼びだして利用すると便利です。

今回、Asanaを使うコードをクラス化してみました。


```js

class AsanaManager {
  constructor(token) {
    this.token = token;
  }

  //プロジェクトのタスク一覧を取得
  getAllTaskByProject(projectId) {
    const url = 'https://app.asana.com/api/1.0/projects/' + projectId + '/tasks';
    const data = this.getAsanaData(url)
    return data;
  };

  //プロジェクトのセクション一覧を取得
  getAllSectionByProject(projectId) {
    const url = 'https://app.asana.com/api/1.0/projects/' + projectId + '/sections';
    const data = this.getAsanaData(url)
    return data;
  };

  //セクションのタスク一覧を取得
  getAllTaskBySection(sectionId) {
    const url = 'https://app.asana.com/api/1.0/sections/' + sectionId + '/tasks';
    const data = this.getAsanaData(url)
    return data;
  };

  //タスクの情報を取得
  getTaskData(task_gid) {
    const url = 'https://app.asana.com/api/1.0/tasks/' + task_gid;
    const data = this.getAsanaData(url)
    return data;
  };

  //カスタムフィールドを取得
  getACustomField(customFieldId) {
    const url = 'https://app.asana.com/api/1.0/custom_fields/' + customFieldId;
    const data = this.getAsanaData(url)
    return data;
  };


  //getでAsanaからデータ取得する関数
  getAsanaData(url) {
    console.log(url);
    const token = this.token;
    const options = this.getGetOption(token);
    const response = UrlFetchApp.fetch(url, options);
    const jobj = JSON.parse(response);
    const data = jobj["data"];
    return data;
  }

  //getなオプションを作成するよ。
  getGetOption(token) {
    const headers = {
      Authorization: "Bearer " + token,
    };
    const options = {
      method: "get",
      contentType: "application/json",
      headers: headers,
      muteHttpExceptions: true,
    };
    return options;
  }

  //ここからタスク作る子たち

  //タスクの作成
  //https://developers.asana.com/docs/create-a-task
  //objPayload(object) Body parameter
  createTask(objPayload) {
    const url = `https://app.asana.com/api/1.0/tasks`;
    const data = this.postAsanaData(url, objPayload);
    console.log('createTask', data);
    return data;
  }

  //セクションにタスクを移動するよ
  //https://developers.asana.com/docs/create-a-section-in-a-project
  //sectionId(Number) 移動したいセクションID
  //objPayload(object) Body parameter
  addTaskToSection(sectionId, objPayload) {
    const url = `https://app.asana.com/api/1.0/sections/${sectionId}/addTask`;
    const data = this.postAsanaData(url, objPayload);
    console.log('addTaskToSection', data);
    return data;
  }

  //サブタスクを作成するよ
  //https://developers.asana.com/docs/create-a-subtask
  //taskId(Number)サブタスクを追加するタスクID
  //objPayload(object) Body parameter
  createSubtask(taskId, objPayload) {
    const url = `https://app.asana.com/api/1.0/tasks/${taskId}/subtasks`;
    const data = this.postAsanaData(url, objPayload);
    console.log('createSubtask', data);
    return data;
  }

  //postでAsanaからデータ追加する関数
  postAsanaData(url, objPayload) {
    console.log(url);
    const token = this.token;
    const options = this.getPostOption(token, objPayload);
    const response = UrlFetchApp.fetch(url, options);
    console.log(response.getResponseCode());
    const jobj = JSON.parse(response);
    const data = jobj["data"];
    return data;
  }

  //postバージョンのオプションを返すよ
  getPostOption(token, objPayload) {
    const headers = {
      "Authorization": "Bearer " + token
    };
    const payload = this.getJson(objPayload);
    const options = {
      "method": "post",
      "contentType": "application/json",
      "Accept": "application/json",
      "headers": headers,
      "payload": payload,
      "muteHttpExceptions": true
    }
    console.log(options);
    return options;
  }

  //オブジェクトをJSONにする
  getJson(object) {
    var json = JSON.stringify(object);
    console.log(json);
    return json;
  }

  //ここからタスクを更新する子たち（put）

  //タスクを更新するよするよ
  //https://developers.asana.com/docs/update-a-task
  //taskId(Number) 更新するタスクID
  //objPayload(object) Body parameter
  updateTask(taskId, objPayload) {
    const url = `https://app.asana.com/api/1.0/tasks/${taskId}`;
    const data = this.putAsanaData(url, objPayload);
    console.log('updateTask', data);
    return data;
  }

  //putでAsanaのデータを変更する関数
  putAsanaData(url, objPayload) {
    console.log(url);
    const token = this.token;
    const options = this.getPutOption(token, objPayload);
    const response = UrlFetchApp.fetch(url, options);
    console.log(response.getResponseCode());
    const jobj = JSON.parse(response);
    const data = jobj["data"];
    return data;
  }

  //putバージョンのオプションを返すよ
  getPutOption(token, objPayload) {
    const headers = {
      "Authorization": "Bearer " + token
    };
    const payload = this.getJson(objPayload);
    const options = {
      "method": "put",
      "contentType": "application/json",
      "Accept": "application/json",
      "headers": headers,
      "payload": payload,
      "muteHttpExceptions": true
    }
    console.log(options);
    return options;
  }


}

```
次は、使い方を紹介いたします。