GoogleフォームでSesame miniを操作する

# はじめに

「Google Apps Script(GAS)経由でSesame miniを操作したいなー」
　→「インターフェースをどうしようかなー」
　→「スプレッドシートでボタンとか作ればいいかな」
　→「フォームがあるじゃん」

ということで、GoogleフォームからGAS経由でSesame miniを開閉します。
下手すると全世界に自宅の鍵を大公開することになりかねないので
**セキュリティについてはよくよく注意してください**。

# 必要なもの

- SESAME mini
- Sesame Web APIが使える環境
    - https://my.candyhouse.co/
    - [CANDY HOUSE DASHBOARD](https://my.candyhouse.co/)からAPIキーを取得してデバイスIDを確認して下さい
    - 参考：[「Node-REDでSesame API v3を使う」手順１. ダッシュボードで情報収集](https://qiita.com/kamijyo/items/a0517a23d997902db749#%E6%89%8B%E9%A0%861-%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5%E3%83%9C%E3%83%BC%E3%83%89%E3%81%A7%E6%83%85%E5%A0%B1%E5%8F%8E%E9%9B%86)
- [Google Apps Script](https://script.google.com/home)の環境
    - https://script.google.com/home

#参考文献
- Sesame APIのドキュメント https://docs.candyhouse.co/#sesame-api

# 作成手順

## 手順１．インターフェースの作成

[「Googleスプレッドシート」](https://docs.google.com/spreadsheets/u/0/)から新規シートを作成します。
出来たスプレッドシートの「挿入」→「フォーム」からGoogleフォームに移ります。

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/1db47ff5-2dce-edc0-1492-6a1d2d52d810.jpeg)

ここでセクションのタイトルと、質問、そして選択項目を設定します。
タイトルは「SESAME mini」、質問は「Command」、
選択項目は「lock」と「unlock」にします。

![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/e762e598-7fd2-c176-40dd-a4a8a25c868a.jpeg)

フォームの右上の目のようなプレビューボタンを押して
実際の表示を確認しておきましょう。

設定したら上のタブの回答をクリックして、
スプレッドシートのアイコンを押します。
ちゃんとリンクされていれば作成したスプレッドシートの
「フォームの回答 1」というシートが開きます。

これでインターフェースの作成は終了です。

## 手順２．GASで処理を記載する

フォームでコマンドを指定して、それをGASで受け取って処理をします。
スプレッドシートの「ツール」→「スクリプトエディタ」からGASに移ります。

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/b8eeb961-9e01-2cf5-f7ea-816413665d4b.jpeg)

もともと入力されているものは消して以下のコードを入力します。

```js
function submitForm(e) {
  var command = e.namedValues["Command"].toString();
  var url = "https://api.candyhouse.co/public/sesame/デバイスID";
  var options = {
    "method" : "POST",
    "headers" : {"Content-Type" : "application/json", "Authorization" : "APIキー"},
    "payload" : JSON.stringify({"command" : command})
  };
  var response = UrlFetchApp.fetch(url, options);
  Logger.log("response = "+response);
}
```

## 手順３．トリガーの設定

入力したスクリプトがフォームの送信時に実行されるように
トリガーの設定をします。

スクリプトエディタの「編集」→「現在のプロジェクトのトリガー」から
トリガー作成画面に移り、「トリガーを追加」からトリガーを追加します。

基本的に設定はそのままでよいのですがイベントの種類を
「フォーム送信時」に変更して保存します。
初回は権限の許可が必要になりますのでログインして許可して下さい。

![8.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257268/85da7d5d-9d8f-c031-0c5d-61b0bd7e36e9.jpeg)

これでフォーム送信時にsubmitFormが動くようになりました。

## 手順４．動作確認

フォームで選んだコマンドが送信時に実行されることを確認して下さい。
フォーム送信後にスクリプトエディタの「表示」→「ログ」から
ログを確認することが出来ます。
API送信が成功していればTaskIDが返ってきているはずです。

うまく動かない場合にもログの確認が必要ですが
ログが残っていない場合にはログの画面からリンクされている
Apps Script ダッシュボードでエラーを確認して下さい。

開閉リクエストのログはスプレッドシート内で確認できます。

# スクリプト解説

あまり解説の必要もないくらいの単純なスクリプトなのですが
何をしているかを解説していきます。

## コマンドの取得

```js
  var command = e.namedValues["Command"].toString();
```

e.namedValues["質問名"]で質問の回答を取得できます。
今回は「Command」という質問の回答として「lock」か「unlock」が返ってきます。
.toString()で返ってきたものを文字列に変換してcommandという変数に格納します。
これがSesame Web APIに渡すコマンドになります。

## HTTPリクエストの送信

```js
  var response = UrlFetchApp.fetch(url, options);
```

UrlFetchAppサービスのfetchメソッドでHTTPリクエストを送ります。
urlとoptionの設定が必要なので、その上で指定しています。

```js
  var url = "https://api.candyhouse.co/public/sesame/デバイスID";
  var options = {
    "method" : "POST",
    "headers" : {"Content-Type" : "application/json", "Authorization" : "APIキー"},
    "payload" : JSON.stringify({"command" : command})
  };
```

urlにデバイスIDを入れたSesame Web APIのURLを指定します。
optionsのheadersにはAPIキーを設定した上で、
引数として最初にフォームから取得したcommandを指定します。

## ログの取得

```js
  Logger.log("response = "+response);
```

ここはログを取る部分なので正常動作が確認できたら削除して構いません。
動作不良の場合には必要に応じてログを取得して下さい。

# セキュリティリスク

さすがにこのまま公開していると全世界の人が鍵を開け放題になるので
最低限として、フォームにパスワードのような質問を設定して、
GASの方で一致したときのみ実行するような仕組みを作りましょう。
それでもリスクは相当高いと思われますので運用は注意して下さい。

# おわりに

GoogleフォームをインターフェースにGASの経由でSesame Web APIを使いました。
ゲストアカウントの使用などに不慣れな方に一時的に鍵の開閉を任せる際に
このような仕組みを使っても良いかもしれません。

`e.namedValues[]`の変数への格納に`.toString()`が必要だったり
APIへコマンドを渡す際に`JSON.stringify()`が必要だったりと、
プログラミングの慣れている人なら常識であろう部分がわかっておらず
こんな単純なスクリプトを組むにも相当な時間がかかってしまいました。

繰り返しますがくれぐれもセキュリティリスクについては
十分留意した上で対策を取った後に使用するようにして下さい。