Google Tasks で前週未消化タスクを次週にリスケする

# 目的

Google カレンダー上でタスク管理をするのに Google Tasks を使っています。

1週間ビューで見ていると、前週未消化タスクを次週にリスケするのが大変なので、自動化します。

（2週間ビューでみると、ドラッグ & ドロップで移動できるという話もあります）

# 前提条件

- Google Tasks API ではタスク期限に時間指定できないため、次週にリスケすると日指定期限タスクとなる。
  - [Add the ability to get/set task due time via API [128979662] - Visible to Public - Issue Tracker](https://issuetracker.google.com/issues/128979662)
- Google Tasks API をサービスとして追加
  ![image-20221128111930529](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221128111930529.png)

# Google App Script

- `due` は文字列のため、日付型で比較してから、改めて `due` を文字列で指定
  - [【JavaScript】日付型（Date 型）と文字列型の相互変換についてのまとめ - Qiita](https://qiita.com/t-yama-3/items/29bd686f2a8b3cb9e784#3-%E6%96%87%E5%AD%97%E5%88%97%E5%9E%8B%E3%81%8B%E3%82%89%E6%97%A5%E4%BB%98%E5%9E%8B%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B)
- タスク期限の更新は `Tasks.Tasks.patch` を使う
  - [How to set Google Tasks Due Date - Stack Overflow](https://stackoverflow.com/questions/49763474/how-to-set-google-tasks-due-date)


```javascript:rescheduleTasksNextWeek.js
function rescheduleTasksNextWeek() {
  const tasks = Tasks.Tasklists.list();
  const taskLists = tasks.items;
  //console.log(taskLists);
  const taskListId = taskLists[0].id // タスクリスト My Task を取得
  //console.log(taskListId);
  const alltodos = Tasks.Tasks.list(taskListId).items; // My Task 内のすべてのタスクを取得
  //console.log(alltodos[0]);
  /*
  { due: '2022-12-16T00:00:00.000Z',
  kind: 'tasks#task',
  position: '00000000000000000000',
  status: 'needsAction',
  id: 'dll2S3lDaVFyMzBEZ1ZYag',
  etag: '"LTEyMTAxNzgwNDc"',
  selfLink: 'https://www.googleapis.com/tasks/v1/lists/taskListId/tasks/taskId',
  links: [],
  updated: '2022-11-27T06:55:00.000Z',
  title: 'test todo' }
  */
  //console.log(alltodos[0].due) //--> string '2022-12-16T00:00:00.000Z'
  
  const today = new Date()// 今日の時間をセット
  //console.log(`today = ${today}`)
  //console.log(`todayISO = ${today.toISOString()}`)
  const weekbefore = new Date() // 1週間前の時間をセット
  weekbefore.setDate(weekbefore.getDate() - 7);
  //console.log(`weekbefore = ${weekbefore}`)

  // 前週のタスクをフィルター
  const thisweektodos = alltodos.filter(function(todo) {
    const tododue = new Date(todo.due);
    if (tododue < today) {
      if (tododue > weekbefore){
        //console.log(tododue)
        return true;
      }
    }
    return false;
  });
  //console.log(thisweektodos)

  // タスク期限を1週間後にアップデート
  for( let i = 0; i < thisweektodos.length; i++ ){
    //console.log(thisweektodos[i].title);
    //console.log(thisweektodos[i].due);
    const thisweektodoid = thisweektodos[i].id;
    //console.log(thisweektodoid)
    const thisweektododue = new Date(thisweektodos[i].due);
    thisweektododue.setDate(thisweektododue.getDate() + 7);
    Tasks.Tasks.patch({due:thisweektododue.toISOString()},taskListId,thisweektodoid)
  }
}
```

# スケジュール実行

以下のようにトリガー指定で毎週土曜に実行させられます。

![image-20221128114507116](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20221128114507116.png)

# 参考

- [GmailのTASKが便利だったので、GASでの利用方法も調べてみた | 経営管理deプログラミング](https://admin-it.xyz/gas/gmail-task-todo-gas/)
- [【GAS】Google Apps Script 活用事例　Google Task APIを使ってみよう。｜nepia_infinity｜note](https://note.com/nepia_infinity/n/naab9e1e25e40)
- [Tasks Service  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/advanced/tasks)
- [Google Tasks APIでタスクの期限を設定する - GeekFactory](https://int128.hatenablog.com/entry/20110927/1317134266)