GASでGoogle Tasks(ToDo)の完了済みタスクもすべて取得する方法

GmailにあるToDoを重宝に使っています。PCでもスマホでも使えるので便利です。デフォルトで存在する「MyTask」に何もかも記録しては完了、記録しては完了を繰り返してきましたが、ある日の完了件数や、あのタスクはいつ完了したんだっけ?ということを調べたくなりました。

参考にしたサイト

毎朝GASでGoogle Tasks(ToDo)を取得して期限切れタスクをSlackで教えてもらう | CODE:LIFE

今回ToDoのタスクを取得するにあたって参考にしたのが、上記のサイトです。

こちらのサイトにほとんどコードは載っていますし、どうやってGoogle Taskにアクセスするかも説明してありますので、私のブログでは省略します(他力本願)。

唯一、物足りなかったのがこちらです↓

デフォルトで完了済みタスクは取得しないっぽい。完了済みはどうやって取るんだろう。

この方が書いているとおり、コードを実行しても、現在のタスクしか取得できません。

現在未完了のタスクだけが抽出される。

でも私は完了した分も見たいのです。

完了分。27件ある。

完了済みのタスクも抽出する方法

完了済みのタスクを抽出する方法は、こちらのサイトを参考にしました。

【GAS】Google Apps Script 活用事例 Google Task APIを使ってみよう。

このサイトにあったコードを実行してみたら、generateArray_()のところで未定義でエラーとなったため、私の環境では実行不可でした。でも、コードの内容はとても参考になったので、さきほどのベイマックスさんのコードをカスタマイズする形で実装しました。

ベイマックスさんの56行目

const tasks = Tasks.Tasks.list(taskList.id).getItems(); // リストからタスクを取得

これを

const tasks = Tasks.Tasks.list(taskList.id,options).getItems(); // リストからタスクを取得

↑こんな風に、optionsを引数に追加しました。

optionsの中身は↓です。

//タスク全部取得オプション
const options = {
    showCompleted: true,
    showDeleted: true,
    showHidden: true,
};

実行した結果はこんな風になりました。

完成コード

// シート取得
const spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
const sheetToDo = spreadSheet.getSheetByName("ToDo");

//タスク全部取得オプション
const options = {
    showCompleted: true,
    showDeleted: true,
    showHidden: true,
};
/**
 * Google Tasksのリストからタスクを取得してスプレッドシートにセット
 */
function getToDo(){
  // シート2行目以下をクリア
  const lastRow = sheetToDo.getLastRow();
  const lastColumn = sheetToDo.getLastColumn();
  sheetToDo.getRange(2, 1, lastRow, lastColumn).clearContent();
  
  // タスク取得
  const table = getLists_();
  
  if (table.length) {
    sheetToDo.getRange(2, 1, table.length, table[0].length).setValues(table); // シートに出力
    spreadSheet.toast(`${table.length}件のタスクを取得しました。`, 'Google Tasks 取得完了', 5); // 完了メッセージ表示
  } else {
    spreadSheet.toast('取得結果が0件です。', 'Google Tasks 取得完了', 5); // エラーメッセージ表示
  }
}

/**
 * Google Tasksからリストを取得
 * @return {Array} 取得結果の二次元配列
 */
function getLists_(){

  const lists = Tasks.Tasklists.list().getItems(); // リストを全て取得
  
  let table = new Array(); // 配列初期化
  for (let i = 0; i < lists.length; i++) {
    table = table.concat(getTasks_(lists[i])); // テーブルにデータを追加
  }
  
  return table
}

/**
 * Google Tasksのリストからタスクを取得
 * @param {TaskList} taskList 取得対象リストのオブジェクト
 * @return {Array} 取得結果の二次元配列
 */
function getTasks_(taskList) {
  const tasks = Tasks.Tasks.list(taskList.id,options).getItems(); // リストからタスクを取得
  const table = new Array(); // 配列初期化
  
  if (tasks) {
    
    for (let i = 0; i < tasks.length; i++) {
      let row = new Array();
      row.push(taskList.title); // リスト名
      row.push(tasks[i].parent); // 親タスク
      row.push(tasks[i].title); // 件名
      row.push(tasks[i].status); // ステータス
      let due = tasks[i].due ? new Date(tasks[i].due) : "";
      row.push(due); // 期限
      let updated = tasks[i].updated ? new Date(tasks[i].updated) : "";
      row.push(updated); // 更新日時
      row.push(tasks[i].notes); // メモ
      
      Logger.log(row);
      
      table.push(row); // 配列に追加
    }
    
  } else {
    Logger.log(`リスト「${taskList.title}」にタスクはありません`);
  }
  
  return table
}
/**
 * メニュー追加
 */
function onOpen() {
  const ui = SpreadsheetApp.getUi(); // UIクラス取得
  const menu = ui.createMenu("GAS"); // メニュー名セット
  menu.addItem("Google Tasks取得", "getToDo"); // 関数セット
  menu.addToUi(); // スプレッドシートに反映
}