【GAS】GSuiteで完結するタスク管理ツールを作った


本記事は [個人開発 Advent Calendar 2019](https://qiita.com/advent-calendar/2019/private-development) 21日目の記事です。

### 1. はじめに
世の中には便利なタスク管理ツールで溢れています。
しかし、なかなか自分の用途に合うものが見つけらず、自作することにしました。

全体のスクリプトは、せっかくなのでgithubに公開しました！
https://github.com/kkkkoyo/mytask
(2019/12/21 : README準備中です。不明点あればご連絡ください..!)

Twitter : [@koyoarai_ ](https://twitter.com/koyoarai_)

===


### 2. 仕様
まず、どんなものを作るかを考えるにあたって、制約と理想を元に仕様を考えました。

**制約**

```
(1) 都合上、TrelloなどのWebアプリケーションは使えない
```

**理想**

```
(1) 共有のハードルを無くしたい
(2) 1週間ごとのログをまとめ、完了タスクもログを蓄積させたい
(3) タスク毎にカテゴリ分けをしたい
```

上記を元に考えた結果、
**gTasksの入力を取得し、スプレットシートに出力するGASを書くことにしました。**

### 3. 構成

<img width="697" alt="ScreenShot 2019-12-17 at 1.20.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/fa64b39b-c621-a730-71bc-a56255942c5b.png">

**(1) 入力**
[gTasksPro](https://apps.apple.com/jp/app/gtasks-pro-tasks-for-google/id1028999835?mt=12)で入力を行います。
※無料版の[gTasks](https://apps.apple.com/jp/app/gtasks-google-gmailtasukudetodotorimaindawo/id1054781057?mt=12)を使用することもできます。 こちらは登録できるタスクの数に制限があるようです。
タスク毎にカテゴリ分けを行うことができ、かつシンプルでとても使いやすいです。

(プライオリティや締切日も設定できますが、僕は利用しないため今回の連携実装には含めていません)
<img width="400" alt="Pasted_Image_2019_12_21_1_33.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/36ca73f0-d642-4cb3-cc1f-1251cacc0d8f.jpeg">
<img width="500" alt="Pasted_Image_2019_12_21_1_14.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/1f6e8fcb-62a4-bcae-2620-69c036d2914b.jpeg">


**(2) 取得**　**(3) 更新**

主な開発はこちらです。
GASを使って、gTasksProから登録されているタスクとステータスを取得し、Google スプレットシートを更新します。

実装したい項目を細分化します。

- シートを一週間ごとに新規作成する。
- 全体のログが記録されたシートも作成し、更新する。
- 既に記載済みのものは、ステータスが変化した時のみ記載する。
- 追加された日を記載し、シートを毎日更新する。

<img width="600" alt="Pasted_Image_2019_12_21_1_47.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/ee96ebd6-b48b-a5de-a6a6-4bf8a879dd05.jpeg">


### 4. 実装
GASから[Google Tasks API](https://developers.google.com/tasks/)を使用します。
タスクリストの名前とタスクリストID(taskListId)を取得し、taskListIdからタスク一覧とその情報を取得することができます。

```javascript
// タスクリストの名前とIDを取得する
function getTaskLists() {
  var taskLists = Tasks.Tasklists.list().getItems();
  if (!taskLists) {
    return [];
  }
  return taskLists.map(function(taskList) {
    return {
      id: taskList.getId(),
      name: taskList.getTitle()
    };
  });
}

/*
 タスクリストからタスク一覧を取得する
 指定した１つのタスクリストに含まれる全ての
 タスクのID、タイトル、メモ、状態（完了済 or 未完了）を取得します。
 ※ 作成日順に降順で格納される　
 
 notes:タスクのメモ
 comleted:完了済みかどうか
*/
function getTasks(taskListId) {
  var tasks = Tasks.Tasks.list(taskListId).getItems();
  if (!tasks) {
    return [];
  }
  return tasks.map(function(task) {
    return {
      id: task.getId(),
      title: task.getTitle(),
      notes: task.getNotes(),
      completed: Boolean(task.getCompleted())
    };
  }).filter(function(task) {
    return task.title;
  });
}
```


#### 4.1 シートを一週間ごとに新規作成する。

月曜日にシートを作成し、その後はそのシートを更新していくようにしました。
GASから日付は、以下のようなスクリプトから取得することができます。

```javascript

// yyyy/MM/ddで日付を返す
function getDate() {
  var formatDate = Utilities.formatDate(new Date(), "JST","yyyy/MM/dd");
  return formatDate;
}

// yyyyMMddで日付を返す
function getToDay() {
  var formatDate = Utilities.formatDate(new Date(), "JST","yyyyMMdd");
  return formatDate;
}

// afterDay日後の日程を返す
function getAfterDay(afterDay) {
  var day = new Date();
  day.setDate(day.getDate() + afterDay);

  var formatDate = Utilities.formatDate(day, "JST","yyyyMMdd");
  return formatDate;
}

// 曜日を返す
function getDayOfWeek() {
  var date = new Date();
  var dayOfWeek = date.getDay();
  var dayOfWeekStr = [ "日", "月", "火", "水", "木", "金", "土" ][dayOfWeek];
  Logger.log(dayOfWeekStr);
  return dayOfWeekStr
}

```

#### 4-3 既に記載済みのものは、ステータスが変化した時のみ記載する。
記録されたタスクのIDと比較し、ステータスが未完了のものと新規で完了しているもののみ記載するようにしました。

#### 4-4 追加された日を記載し、シートを毎日更新する。
シートを毎日更新するために、決まった時刻に動作させるようにトリガーを追加します。
`編集→現在のプロジェクトのトリガー`からトリガーを設定します。
<img width="200" alt="Pasted_Image_2019_12_21_2_56.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/a22eafcd-8ac5-3c4f-498f-c0d41b619264.jpeg">

現在の日時を取得して毎日更新をしたいので、午後10〜11時に設定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139949/a35b9be9-e582-6c95-5253-67efe06d47ec.png" width="200" px>

※注意点
gTasksProに追加したタスクは、gmail横に表示される、「ToDoリスト」と同期されます。
しかし、ToDoリストからステータスを変更した場合は、うまくGoogle Tasks APIから取得できませんでした。
おそらく、ToDoリスト上では完了と削除を同時に行なっているのだと思われます。
参考 : [【忙しい貴方へ】新Gmailイチ押しの新機能「ToDoタスク管理」の使い方 \| できるネット](https://dekiru.net/article/16605/)

### 5. まとめ
gTasksProに入力したデータを取得し、Googleスプレットシートを更新するGASを書きました。
シートを1週間毎で作成したり、全体を俯瞰できるシートを作成したり、スクリプトでフォーマットを自分好みにすることができます。
特にGSuiteで完結したい場合、スプレットシートを共有する際は便利だと思います。

明日は@07JP27さんの記事です。
お楽しみに。


---

#### 参考
- [Google Apps ScriptからGoogle Tasks を操作する
](https://www.virment.com/use-google-tasks-from-script/)

- [Google App Script をgitで管理する]
(https://qiita.com/qwq00/items/888881b1d7702d287752)
  - [clasp](https://github.com/google/clasp)を利用すればローカルでGASを管理できます。