GASを使ってGoogleTask(TODO)をSlackにメンション/通知する【GoogleAppsScript】

今回はGoogleAppsScriptを使ってGoogleTaskをSlackで通知するように設定していきたいと思う。GoogleTaskっていうのはGoogleカレンダーを表示すると右側に出てくるやつ。タスク管理アプリの記事でも触れましたね。

手軽にシンプルに使えていいんだけど、タスク追加したけどやり忘れたりすることもあるでしょう。そこで、タスクを忘れないように追加したTodoはSlackで通知するようにしたいと思う。

忘れられるGoogleTask

カレンダーの脇から追加できるタスクだけど、かなり簡単に編集する事ができて便利です。使ったことのない人は、カレンダーを開いて右側からタスクを追加したり削除したりしてみてください。

ここに追加されたタスクを今回はSlackを使って通知させていきます。使うのはGoogleAppsScriptで、記載されているTODOリストをかっさらってそれをSlackに通知させるっていう感じです。

GASからTODOをSlack通知するアプリケーション

手順としてはシンプルです。

  1. GASでGoogleTaskからタスクを取得する
  2. 取得したタスクをSlack通知する

GASからGoogleTaskを取得して、その取得したものをSlack通知してやればOK。

TaskAPIを有効にする

まずは、GASからGoogleTaskを操作するためにTasksAPIというものを有効にしないといけません。リソースからGoogleの拡張サービス...へ進んでTasksAPIを探します。

見つかったら、それをONにしてOKです。

GoogleTaskを取得する

TasksAPIを有効にしたら、適当にタスクを作ってみます。

この作ったタスクをGASの方で取得すればOK。

TodoリストのリストIDを取得する

TODOリストがカレンダーの右側に表示されるけど、このTODOリストって複数作れます。「新しいリストを作成」ってやつですね。

リストごとにタスクを持つので、どのリストのタスクを通知させるのかを絞り込みたいですよね。リストにはそれぞれIDが割り振られているから、それを取得して絞り込むことにします。

const getTaskLists = () => {
  const taskLists = Tasks.Tasklists.list().getItems();  
  const lists = taskLists.map(function(taskList) {
    return {
      id: taskList.getId(),
      name: taskList.getTitle()
    };
  });

  Logger.log(lists);
}

これを実行すると、ログにリストのIDが表示されるから、そこに表示されたIDをコピーしておこう。このログは[表示]→[ログ]からみる事ができます。

リストのタスクを取得する

リストのIDが分かったらそのリストIDを記述して、そのリストが持っているタスクを取得しましょう。下記のように書くと、リストが持っているタスクを取得できます。

Tasks.Tasks.list('リストID').getItems();

中身が見たい場合には、` Logger.log(Tasks.Tasks.list('リストID').getItems())`みたいにLogを出して[表示]→[ログ]から見てみるといいです。

Slackに通知する

大まかにタスクは取得できたので、Slackの通知を考えましょう。Slackに通知するにはWebhookURLというものが必要なので、それを取得します。https://slack.com/services/new/incoming-webhookにアクセスしてwebhookを追加です。どのチャンネルに通知させたいかを選択して[Incoming Webhookインテグレーションの追加]をクリック。

Webhook URLというものがあるので、それをコピーしておきます。

WebhookURLを取得したらそれをコードに貼り付けて使います。ざっくりこんな感じでいきます。急にコード多くなったけど、execute関数を実行するとタスクの通知をSlackに飛ばす事ができる

const getTaskLists = () => {
  return Tasks.Tasks.list('リストID').getItems();
}

const createMessage = (todos) => {
  let message = "";
  if (!todos.length) {
    message += "完了していないタスクはありません"
  } else {
    message += "完了していないタスクは以下です" + "\n"
    todos.forEach(todo => {
      message += "◯" + todo.getTitle() + "\n"
    })
  }
      
  return message
}


const toSlack = (message) => {
 const postUrl  = "https://hooks.slack.com/services/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" 

 const jsonData = {
   "username" : "TODO通知",
   "icon_emoji" : "rocket",
   "text" : message
 }  

 const options =
 {
   "method" : "post",
   "contentType" : "application/json",
   "payload" : JSON.stringify(jsonData)
 };
  
 // Slackに通知する
 UrlFetchApp.fetch(postUrl, options);   
}

function execute() {
 const todos = getTaskLists()
 const message = createMessage(todos)
 toSlack(message)
}

executeを実行するとこんな感じできます。

細かい設定をしたかったら

このコードだと完了して隠れたものは通知されないけど、ここの部分はパラメーターを変更する事で取得するTODOを色々変える事ができる。GoogleTasksAPIから画面上でリクエストを投げて確かめる事ができるから、自分のリストIDを入力して色々試してみるといいです。

コード上は、リストIDを記述した後にオブジェクトで持っておけばOKです。

const getTaskLists = () => {
  return Tasks.Tasks.list('リストID', {
    showCompleted: true,
    showHidden: true
  }).getItems();
}

ちょっといじると通知されるTODOが変わりますね。完了したものや削除したものも通知させたいのか?とか要望に応じていじってみるといいでしょう。

毎日通知させるようにする

毎日TODOをSlackに通知させるようにするには、トリガーを追加します。[編集]から[現在のプロジェクトのトリガー]に進んで設定しましょう。

今回execute関数の中に他の関数を実行する処理を書いたから、executeを選択。

設定は自分好みにやっちゃってください。

まとめ

GoogleAppsScriptやっぱり便利だなあ。Googleのサービスは色々繋げて使う事ができるし、今回みたいにSlackに通知させることもできる。何より環境用意しなくていいっていうのがもの凄い良い。サーバー立ててcron実行してslack通知なんて面倒なだけですからね。トリガー使って定期的に実行できるっていうのも素晴らしいです。

GoogleTaskを普段から使っている人は今回のようにSlackに通知させてみてもいいかもしれません。SlackじゃなくてもLINEや他のアプリにもできるだろうから試してみてください。

Twitterでフォローしよう

おすすめの記事