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

#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
書いたコードとしては大体こんな感じ。

```javascript
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と組み合わせると夢は無限大です。

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