GHKit ZeroとGoogle Apps Scriptの連携

「[GHKit Zero](https://ghkit.jp/ "GHKit Zero")」は、Google Homeに、プッシュ通知機能を追加することを目的に開発されたキットです。

ここでは、「[GHKit Zero](https://ghkit.jp/ "GHKit Zero")」と、Google Apps Scriptとの連携手順を説明します。

具体的には、15分に一度Gmailの未読メールを定期的に検索し、未読メールがあった場合に「受信トレイに◯件の未読メールがあります。最新メールのタイトルは.....です。」という音声再生リクエストをGoogle Homeに送信する手順について記載します。
![スクリーンショット 2019-04-10 12.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160696/d5946087-d4c5-185f-7016-176850977eee.png)
本手順をマスターすれば、Google Apps ScriptがサポートするGoogleスプレッドシート、フォーム、カレンダーなど、様々なイベントをトリガーにして、Google Homeにメッセージを送信（再生）することが可能になります。

本記事では、Google Apps Scriptの概要や構成、文法等の詳細については説明しませんが、本記事を参考に、是非とも様々な使い方を試してみてください。

# 設定前の準備

連携を設定する前に、以下の項目を確認してください。

**1. 「Google Home」と「GHKit」のセットアップ**

最初に、Google Homeをセットアップし、利用できる状態にしておいてください。

次に、HP上の手順を参考に「[GHKit Zero](https://ghkit.jp/ "GHKit Zero")」をセットアップし、Google Homeとの接続を確認してください。

**2. Googleスレプッドシートを開く**

[Googleスレプッドシート](https://www.google.com/intl/ja_jp/sheets/about/ "Googleスレプッドシート")を通じて、Google Apps Scriptを記述します。

[Googleスレプッドシート](https://www.google.com/intl/ja_jp/sheets/about/ "Googleスレプッドシート") にアクセスし、お使いのGoogleアカウントを用いて使用を開始してください。

新しいスプレッドシートを作成し、名前を「GAS」として保存します。
![スプレッドシート.png](https://qiita-image-store.s3.amazonaws.com/0/160696/7cd194b8-8fbf-b36d-9a85-23cabeed7901.png)

**3. 連携情報の用意**

「[GHKit Zero](https://ghkit.jp/ "GHKit Zero")」同梱の書類より「GHKit ID」と「Code」をご準備ください。

* GHKit ID：ここでは例として「abcde12345」を用います。
* Code：ここでは例として「123456」を用います。

# 連携の設定

連携の設定は、先ほど作成したGoogleスレプッドシート「GAS」で行います。

「ツール」メニューより「スクリプトエディタ」を選択し、Google Apps Scriptの編集画面を開きます。

同じく名前（プロジェクト名）を「GAS」に設定します。

![エディター.png](https://qiita-image-store.s3.amazonaws.com/0/160696/de17b0ef-fd46-a5da-c93a-3f16d61c0942.png)

## HTTPリクエスト

まず最初に、Google Apps Scriptが用意する「UrlFetchサービス」を用いて GHKit の Webサーバーに接続し、任意のメッセージでGoogle Homeに音声再生をリクエストします。

「コード.gs」に下記のコードを記載します。
「message」を任意のメッセージに、「ghkit」「code」を上記で準備した情報に置き換えてください。

```javascript
function myFunction() {
  
  var message = "音声再生したい任意のメッセージをここに記載";
  
  // HTTPリクエスト（POST/JSON形式）の設定
  var url = "https://zero.ghkit.jp/"
  var data = {
    "ghkit" : "abcde12345", // ご自身のGHKit IDに置き換え
    "code" : "123456", // ご自身のCodeに置き換え
    "message" : message
  }
  var options = {
    "method" : "post",
    'contentType' : "application/json",
    "payload" : JSON.stringify(data)
  }
  
  // HTTPリクエスト（POST/JSON形式）を実行
  var response = UrlFetchApp.fetch(url, options);
  
  // POST結果の取得
  var content = response.getContentText("UTF-8");
  Logger.log(content);
  
}
```
実行ボタン ![スクリーンショット 2019-04-10 11.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160696/20cf2ca4-1e25-cba8-bbb1-cf8a7ccb0064.png) を押して実行します。
Google Homeより音声再生が行われれば成功です。

### 承認手順について

初めて実行した際、「承認が必要です」というメッセージが表示されます。

その際「許可を確認」ボタンをクリックすると認証画面が表示されるので、ご自身のGoogleアカウントを選択し、承認手続きを実行してください。

ここで、次のようなアラートが表示される場合があります。
![スクリーンショット 2019-04-09 13.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160696/4c91829f-72d0-23f8-c8b0-47f68521f1e4.png)

この時、青地の「安全なページに戻る」ではなく、「詳細」をクリックし、次に「GAS（安全でないページ）に移動」をクリックして承認手続きを実行してください。

## Gmailの情報を取得

GHKit の Webサーバーに Google Home への音声再生をリクエストすることができましたので、次にGmailの情報を取得し、未読メールがあった際に「「受信トレイに◯件の未読メールがあります。最新メールのタイトルは.....です。」というメッセージを送信するようにします。

先ほど作成したスクリプトを上書きする形で、下記のコードを記載します。
前半部分がGmailの情報を取得するコード、後半はHTTPリクエストを実行するコードで、上述と同じコードです。

```javascript

function myFunction() {
  
  // 取得するメールの条件を指定する。ここでは、受信トレイの未読メールを指定
  var SearchString = 'in:inbox is:unread';
  // 条件にマッチするスレッドを取得する。ここでは、最新のスレッドから最大10件を取得する
  var myThreads = GmailApp.search(SearchString, 0, 10);
  // スレッドに含まれるメールを取得する
  var myMails = GmailApp.getMessagesForThreads(myThreads); 
  
  // 未読メールが無い場合、終了する
  if(myThreads.length == 0){
    return;
  }

  // 未読メールがある場合、GHKit Zeroへ音声再生するメッセージを作成する  
  // メッセージ前半の「受信トレイに..件の未読メールがあります」を設定する
  var message = "受信トレイに" + myThreads.length + "件の未読メールがあります。";
  
  // 最新のメールのタイトルを取得する
  // 0番目のスレッドが最新のスレッドになり、その中の最後のメッセージが最新のメールになります
  var title = myThreads[0].getMessages()[ myThreads[0].getMessageCount() - 1 ].getSubject();

  // メールのタイトルを文言に追加する
  message += "最新メールのタイトルは" + title + "です。";

  // 
  // ここより下は、HTTPリクエストのスクリプトと同じ
  // 

  // HTTPリクエスト（POST/JSON形式）の設定
  var url = "https://zero.ghkit.jp/"
  var data = {
    "ghkit" : "abcde12345", // ご自身のGHKit IDに置き換え
    "code" : "123456", // ご自身のCodeに置き換え
    "message" : message
  }
  var options = {
    "method" : "post",
    'contentType' : "application/json",
    "payload" : JSON.stringify(data)
  }

  // HTTPリクエスト（POST/JSON形式）を実行
  var response = UrlFetchApp.fetch(url, options);

  // POST結果の取得
  var content = response.getContentText("UTF-8");
  Logger.log(content);
}
```
Gmailの受信トレイの未読メールを確認し、実行ボタン ![スクリーンショット 2019-04-10 11.42.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160696/20cf2ca4-1e25-cba8-bbb1-cf8a7ccb0064.png) を押して実行します。
Google Homeより期待した音声再生が行われれば成功です。

## 15分おきに実行する

Google Apps Scriptの時間主導型のトリガーを利用して、15分おきに作成したスクリプトを定期的に実行します。

「編集」メニューより「現在のプロジェクトのトリガー」を選択し、続いて新しいトリガーを追加します。

以下のように設定してトリガーを追加することで、作成したスクリプトを15分おきに自動実行することができます。
![トリガー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/160696/e46200d1-fd25-8c4a-d651-e3bf9e3802cd.png)

しばらく待って自動実行されれば成功です。

# 最後に

今回は、Google Apps Scriptの「UrlFetchサービス」「Gmailサービス」「時間主導型のトリガーサービス」を利用して、15分おきにGmailの未読メールの件数とメールタイトルをGoogle Homeに音声再生リクエストする手順について説明しました。

Google Apps Scriptにはこの他にも、Googleスプレッドシート、カレンダー、フォーム、ドライブなど様々なサービスがあり、多様な連携を作成することが可能です。

どのように利用するはかアイデア次第です。面白い使い方を是非発見してください。