#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と組み合わせると夢は無限大です。
そして、ダブルクォーテーションにはお気をつけて…笑