2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Google home miniからGoogle ToDoリストにタスクを追加してみた

Last updated at Posted at 2019-12-11

#Googleに魂を売る生活
普段Googleのサービスをいっぱい使ってます。無料のばっかですが。
メールはGmail、写真はGoogleフォトに保存し、データをGoogleドライブに保存し、簡単なタスク管理としてGoogle ToDoリストを使い、メモはGoogle keep、音楽はGoogle Music。Wi-FiまでGoogle Wi-Fiを購入する始末。
最近はGoogle home miniを導入し、家のいろいろをIoT化させるのが楽しいです。まさにGoogleに魂を売る生活。GAFA様様。スマホはiPhoneのくせして。

さて、Google home miniちゃんなんですが、この子いろんなことに使えて、デフォルトで買い物リストとか作成できるんですよ。ただ、この買い物リストは声で聞く前提なのか何なのかGoogle Assistantアプリのずいぶん奥深くにある…
普段タスクをGoogle ToDoリストで管理してるからこいつと連携してほしいのに…

と、いうことでなんとかGoogle home miniからGoogle ToDoリストにタスクを追加できないかとやってみました。備忘録です。

#材料

材料は以下。

  • GAS: Googleのいろんなサービスを動かせちゃうスクリプト言語。Google版のVBAみたいなもん。JavaScriptがもとになってる
  • IFTTT: いろんなWebサービスなどを連携させるサービス

#連携のさせ方
作戦としては、あらかじめPOSTリクエストに応じてGoogle ToDoリストにタスクを追加するプログラムをGASで作成。Google home miniに声を掛けたらIFTTTを通じ、webhooksでそのGASプログラムのURLにPOSTリクエストを送っちゃおうというものです。
GASを始めるには、とかGASでGoogle ToDoリストを動かすためにはライブラリからTasks APIを有効にして…とかあるんですが他に記事もあるので省略。

##GAS
書いたコードとしては大体こんな感じ。

function doPost(e){
  try{
    var jsonString = e.postData.getDataAsString();
    var data = JSON.parse(jsonString);  //{"title":"hoge","due":"fuga"}の形式で来るようにする。
    addTask(data);
  }catch(e){
    GmailApp.sendEmail("xxxxxx@gmail.com", "Function addTasks error", "error:" + e) //エラーがあったらメールで送る
  }
}

//タスクを追加したいリストのIDを取得
function getTodoId(){
  //あらかじめスクリプトプロパティにIDを入れておく
  return PropertiesService.getScriptProperties().getProperty("TODO_ID");
}

//タスクを追加
function addTask(event){
  var id = getTodoId();  //リストのID
  var taskList = Tasks.Tasks  //リストを取得
  var neoTask = Tasks.newTask();  //新しいタスクをインスタンス化的な?
  
  //引数からタイトルと〆切を取得し、タスクを作成
  neoTask.title = event.title;
  if(event.due){
    neoTask.due = event.due
  }
  
  //リストに新しいタスクを追加
  taskList.insert(neoTask, id);
}

タスクの作り方はGASで利用できるほかのサービスと若干毛色の違う使い方。ちょっとオブジェクト指向っぽい?

流れとしては、POSTリクエストが来るとdoPost関数が呼び出されるので、そこから処理を走らせる感じです。
ぶっちゃけaddTask関数でtitleとdueがキーのjsonを想定してますが、dueのとこは将来的な余地として〆切も追加したいなあと思ってるだけなので、dueは省略可能です。IFTTTのとこでも同様。

これを「公開」→「ウェブアプリケーションとして導入」。匿名を含む全員に使えるようにします。(認証とかいろいろあったはず)
そうするとexecで終わるURLが取得できるので控えておきます。
これだけで簡単なwebサーバみたいになっちゃうんだからすごいですよね。

##IFTTT
で、IFTTTのthisにはgoogle assistantを追加し、
「タスクに $ を追加して」
といったら起動するように。

thatにはwebhooksを追加し、

URL: さっきのGASのURL
メソッド: POST
Content Type: application/json
ボディ: {"title":"<<TextField>>","due";""}

に。「<<TextField>>」はAdd Ingredientを選ぶと変数みたいな感じで挿入できるやつです。

これで完璧!!!

###…のはずだった
うまくいかない。さっぱりうまくいかない…。なぜだ…。テストコードでjsonを渡したらうまくいくのに、いざ本番でやってみるとさっぱりjsonを読み取ってくれない…
doPostはうまくいくし、どうして…

###そして判明したこと
全然わからなくてふてくされて放置して数週間、思い立ってまたやってわかりました。
私、IFTTTの操作をiPhoneで何の気なしにやってたんです。原因は「"」でした。

####ダブルクォーテーションマーク
私全然把握してなかったんですが、iPhoneの英語のキーボードで普通にダブルクォーテーションを打つと、「“」「”」が出るんですね。あの小さな画面だとわかりづらいのですが、「"」ではない。よーく見ると傾いてます。欲しいやつは傾いてません。前者はユニコードでU+201CとU+201D。欲しいダブルクォーテーションはU+0022。なんだよそんなことかよ…と気が抜けました。なんだったんだ。
もしやと思ってパソコン上でのダブルクォーテーションをコピペして自分宛にGmail送って比較して気づきました。

ちなみに、iPhoneのキーボードでダブルクォーテーションを長押しするといろんな種類のダブルクォーテーションが出てきました。スマホとかでコードをメモしたい時なんかにどうぞ。そのままコピペできるようになるはず。

##そんなわけで
そんなわけで無事にタスクを追加できるようになりました。やったね!
まあ一番なのは素直にGoogle homeから直接Google ToDoリストに追加できるようになることなんですけどね…同じGoogleのサービスなんだからそれぐらできてほしいなぁ…

ついでに言うとGoogle keepをGASで動かせるようにもなってほしいです。
Google documentとGoogle keepが連携できるようになったらしいし、実はできたりするのかな。

#まとめ
何が言いたいかというと、GAS便利ですね。Googleのサービスのヘビーユーザーなら使わない手はないですね。いろんな連携ができて、簡易的にWebアプリ化できるのでIFTTTと組み合わせると夢は無限大です。

そして、ダブルクォーテーションにはお気をつけて…笑

2
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?