GoogleAppsScript

Google Apps ScriptからGoogle Tasks を操作する

はじめに

Google TasksはGoogle製のToDoリストアプリです。他にあるWunderlistやTodoistなどに比べると機能面ではまだこれからという印象ですが、最近ではGmailやGoogle Driveとの連携機能が強化されており今後より便利になる可能性が高いです。また、すでにAPIも公開されておりGoogle Apps Scriptから操作できるため、GmailやGoogleスプレッドシートなどと連携したスクリプトも簡単に作成できます。ここでは、Goolge Apps ScriptからGoolge Tasksのタスクを操作するための準備と、実査にGoogle Apps Scriptから読み取ったり新しく追加したりする基本的なスクリプトをメモします。

できるようになること

Goolge Tasksに対して、以下の操作をGoogle Apps Scriptから実行できるようになります。なお、以降では、1つもしくはそれ以上の複数のタスクを含むリストのことを「タスクリスト」と呼んでいます。

  • 全てのタスクリスト一覧を取得する
  • タスクリストからタスク一覧を取得する
  • タスクリストに新しいタスクを追加する
  • タスクを新規追加する
  • タスクの完了、未完了状態を変更する
  • タスクを削除する

環境と前提

全てブラウザ上での作業になります。必要となるものはGoogleアカウントのみです。

手順概要

Goolge Apps ScriptからGoogle Tasks APIを使用するには、まずGoolge Tasks APIを有効化する必要があります。有効化した後、公式ドキュメントを参考にいくつかのスクリプトを紹介します。

Google Tasks APIを有効化する

Google Tasks APIは2018年9月時点ではデフォルトでは有効になっていません。そこでまず有効化する手順を説明します。有効化手順は以下の公式ドキュメントに従いました。

まず、適当にスクリプトエディタを開きます。Googleスプレッドシートを開いて「ツール」→「スクリプトエディタ」から開くか、もしくはGoogle Driveから直接Google Apps Scriptを開きます。
そして以下のようにスクリプトエディタのメニューの「リソース」の中に「Googleの拡張サービス…」というメニューがあるのでこれをクリックします。なお、以下の画像では適当なコードが入っていますが、以降の有効化のための作業においてコードが記述されている必要はありません。

以下のように「Googleの拡張サービス」というダイアログが開き、スクロールしていくと「Tasks API」があるので、「無効」と表示されているトグルをクリックします。

トグルをクリックすると以下のように「ON」と表示されます。続いて「これらのサービスをGoogle API コンソールでも有効にする必要があります。」というメッセージの中の「Google API コンソール」がリンクになっているのでこれをクリックします。

以下のようにGoogle API コンソールのトップページ表示されます。

ここで、トップにある検索バーから「tasks」と検索すると出るのでクリックします。

以下のように表示されるので、ここの「有効にする」をクリックします。

有効化されると以下のようにTasks APIのダッシュボードに移ります。ここでエラーの確認などができるようになります。

以上で有効化は完了です。次に基本的な操作を行うGoolge Apps Scriptのスクリプトをメモします。

Google Tasksを操作するスクリプト

以下のGitHubリポジトリにタスクの追加、削除、更新といった基本的な操作を行うスクリプトが掲載されています。この中のスクリプト、また一部変更したスクリプトを以降の載せます。

gsuitedevs/apps-script-samples – GitHub

Simple Tasks is a sample web app built using Apps Script that provides limited read and write access to your data in Google Tasks. It was created using the Html Service and demonstrates some common patterns and best practices to use when developing user interfaces.

全てのタスクリスト一覧を取得する

自身のGoolge Tasksに登録されている全てのタスクリストのID、名前を取得します。

function getTaskLists() {
  var taskLists = Tasks.Tasklists.list().getItems();
  if (!taskLists) {
    return [];
  }
  return taskLists.map(function(taskList) {
    return {
      id: taskList.getId(),
      name: taskList.getTitle()
    };
  });
}

使い方と得られる結果

上記のgetTaskListsを以下のように使ってみます。

function myFunction(){
  
  var myTaskLists = getTaskLists();
 Logger.log( myTaskLists );
 Logger.log( myTaskLists[0].id); //  = "aaaaaaaaaaaaaaaaaaaaaaaaaaaa" 
 Logger.log( myTaskLists[1].id); //  = "bbbbbbbbbbbbbbbbbbbbbbbbbbb"
 Logger.log( myTaskLists[0].name); //  = "My Tasks"
 Logger.log( myTaskLists[1].name); //  = "ToDo"

}

Loggerによって記録されたログを確認してみてください。ログ内容はCtrl+Enterで確認できます。配列の中にJSON形式でidとnameが格納されます。すなわち、getTaskListsは以下を返します。(ただし、以下は見やすいように整形しています。)
以下は「My Tasks」、「ToDo」という名前のタスクリストが存在する場合です。

[{
    id: aaaaaaaaaaaaaaaaaaaaaaaaaaaa,
    name: My Tasks
}, {
    id: bbbbbbbbbbbbbbbbbbbbbbbbbbb,
    name: ToDo
}]

タスクリストからタスク一覧を取得する

指定した1つのタスクリストに含まれる全てのタスクのID、タイトル、メモ、状態(完了済 or 未完了)を取得します。

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;
  });
}

使い方と得られる結果

上記の getTasks を以下のように使ってみます。

function myFunction(){
  
  var myTaskLists = getTaskLists();
  var myTasks       = getTasks( myTaskLists[0].id )

  Logger.log( myTasks );
  Logger.log( myTasks[0].title ); // = "first todo"

}

Logger( myTasks )の内容は以下になります。(ただし、以下は見やすいように整形しています。)
notesはタスクのメモ、comletedは完了済(trueの場合)、未完了(falseの場合)のフラグになります。titleがタスクのタイトルです。
なお、タスクの完了、未完了状態に関わらず、作成日順に降順で格納されます。すなわち、一番作成日が新しいタスクが配列の一番最初の要素になります。

[{
    notes = null, 
    id = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, 
    completed = false, 
    title = first todo
}, {
    notes = null,
    id = yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy,
    completed = false,
    title = second todo
}]

タスクリストに新しいタスクを追加する

指定したタスクリストに新しいタスクを追加します。なお、以下では新しく追加するタスクのタイトル、メモ、日付を指定しています。

function addTask(taskListId) {
  var task = {
    title: '牛乳を買う', //  タイトル
    notes: 'スーパーで購入', // メモ
      due: '2018-09-26T00:00:00.000+08:00' // 締切日。日付のフォーマットはRFC3339に準拠
  };
  task = Tasks.Tasks.insert(task, taskListId);
   Logger.log("新しいタスクのID:" + task.id);
}

使い方と得られる結果

上記の addTask を以下のように使ってみます。

function myFunction(){
  
  var myTaskLists = getTaskLists();
  var myTaskListID       = myTaskLists[0].id

  addTasks( myTaskListID );
 
}

以下のように新しいタスクが追加されます。

なお、締切日の日付のフォーマットについてはRFC3339に準拠する必要があります。RFC3339については以下が参考になりました。

RFC 3339の日付形式 – suikawiki

RFC 3339の日時形式は、 IETF が RFC 3339 で規定した日時形式です。 ISO 8601の日時形式のプロファイルであり、 21世紀に入ってから作られた色々な IETF のプロトコルで採用されています。

タスクの完了、未完了状態を変更する

指定したタスクの完了、未完了を変更します。

function setCompleted(taskListId, taskId, completed) {
  var task = Tasks.newTask();
  if (completed) {
    task.setStatus('completed');
  } else {
    task.setStatus('needsAction');
    task.setCompleted(null);
  }
  Tasks.Tasks.patch(task, taskListId, taskId);
}

使い方と得られる結果

上記の setCompleted を以下のように使ってみます。

function myFunction(){
  
  var myTaskLists = getTaskLists();
  var myTaskListID       = myTaskLists[1].id
  var myTasks       = getTasks( myTaskListID )
  var myFirstTaskID = myTasks[0].id

  setCompleted( myTaskListID, myFirstTaskID, true);
 
}

上記を実行すると、指定したタスクが完了状態に変更されます。もし未完了にしたい場合は、同じように setCompleted( myTaskListID, myFirstTaskID, false);としてfalseを指定すれば未完了に戻ります。

タスクを削除する

指定したタスクを削除します。なお、調査不足かもしれませんが、削除してしまったタスクを元に戻す方法は不明です。削除は以下のようにタスクリストIDとタスクのIDを指定して削除するremove関数がデフォルトで用意されています。

Tasks.Tasks.remove(taskListId, taskId);

実行時に承認を行う

スクリプトを実行してみると、承認が必要ですといつものように表示されます。

以下のように「タスクの表示」の承認を求められるので、「許可」をクリックします。

まとめ

Google Apps Scriptを使ってGoogleの色々なサービスを連携させてつなげていくことで、特に社内向けの業務を自動化できると思います。またいずれもっと実践的なスクリプトをメモできればと思います。

SPONSORED LINK

コメントを残す

メールアドレスが公開されることはありません。