kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

Voiceflow TIPS #29 Airtableと組み合わせて、もっとデータベースらしく

Voiceflow夏休みAdvent Calendarの29日目です。昨日あげれなかった分をまずアップします。今日の分はこれから・・・

Googleスプレッドシートをデータベースっぽく使う使い方は、過去に4回に渡ってご紹介しました。

で、その際に少しだけ記載していたのですが、

Googleスプレッドシート連携では複数条件の指定した検索などができないため、データベースのような凝ったことはできませんが、非常にお手軽に使えるという雰囲気が伝われば幸いです。

Voiceflow TIPS #19 Googleスプレッドシート連携で作るゼロカロリースキルもどき 〜スプレッドシートの削除〜 - kun432's blog

これ、もちょっとできるとほんとにデータベース的に使えるんですよねぇ・・・ということで、今回は「Airtable」というオンラインデータベースサービスとの連携をご紹介します。Airtableと連携させると、Googleスプレッドシートでできなかった複数条件での検索とかができるようになります。

ちなみにAirtableがどういうサービスなのか?については以下の記事をご覧いただければと思います。

はい、ではこういう物を作りたいと思います。


アレクサ、「会社の内線番号」をひらいて

内線番号スキルです。内線番号を知りたい部署名と担当者名を言ってください。例えば「〇〇○部の△△△さん」と言ってください。

営業部の鈴木さん

営業部の鈴木さんですね。内線番号は001です。


部署名と名前の2つの条件で検索します。ほんのちょっとだけデータベースらしい感じにしてみました。

データベースの作成

Airtableのアカウントは作成済み・ログイン済の前提です。まずはワークスペースとベースを作ります。Airtableでは、データベースをおいておく場所のことを「ワークスペース」、データベースのことを「ベース」といいますので、その呼び方に従って説明します。

まず、「ワークスペース」の作成です。「+ Add a workspace」をクリックします。

f:id:kun432:20190830011551p:plain

ワークスペース」の名前をつけます。ここでは「Company」にしました。

f:id:kun432:20190830011959p:plain

「ベース」を作成します。「+ Add a base」をクリックします。

f:id:kun432:20190830011600p:plain

メニューが出てきます。テンプレートから作成、スプレッドシートのインポート、まっさらから作成の3通りから選べます。今回はCSVを用意しましたのでそれをインポートしましょう。こんな感じのCSVファイルを用意してください。

name,department,number
鈴木,営業,001
佐藤,開発,101
田中,総務,201
橋本,カスタマーサポート,301
鈴木,カスタマーサポート,302
佐藤,総務,202

「Import a spreadsheet」をクリックします。

f:id:kun432:20190830011604p:plain

スプレッドシートのインポート画面が表示されますので、「Choose a .csv file」をクリックします。

f:id:kun432:20190830011609p:plain

アップロード画面が出ます。CSVをドラッグドロップしてください。

f:id:kun432:20190830011743p:plain

「Upload」をクリックして、アップロードします。

f:id:kun432:20190830012009p:plain

アップロードが終わると、「ベース」の名前を入力します。アイコンや色も変えれます。ENTERで終了します。

f:id:kun432:20190830013950p:plain

できた「ベース」を開いてみましょう。クリックします。

f:id:kun432:20190830013956p:plain

こんな感じでちゃんとインポートされてますねー。ちなみに上にExcelのシートのタブっぽいものが見えますが、これが「テーブル」になります。

f:id:kun432:20190830013604p:plain

テーブルの名前も適当に書き換えておきましょう。

f:id:kun432:20190830210738p:plain

Airtableがすごいのはここからです。右上のHELPをクリックして、"API Documention"をクリックします。

f:id:kun432:20190830205108p:plain

別のウインドウでAPIのドキュメントが開きます。真ん中に「ベース」のIDが表示されています。

f:id:kun432:20190830205429p:plain

下にスクロールしてみると、読み込んだレコードを取得するためのコマンドが表示されていますが、実行結果の例を見ると、さきほどアップロードしたデータの中身が表示されていますよね?一般的なAPIドキュメントだとだいたい例が用意されていて、それを読んで自分で必要なパラメータを設定して実行して結果を見る、という感じだと思うんですが、Airtableでは自分が用意したデータに合わせる形のAPIドキュメントが用意されるんですね、これは便利ですよね!

f:id:kun432:20190830211154p:plain

なので、右側に用意されているコマンドを実行すると実際の実行が見れます。で、コマンドの実行にはAPIキーが必要ですが、これも右上のチェックをクリックすると自動的にコマンドの中に設定されます。(APIキーは伏せてます)

f:id:kun432:20190830211622p:plainf:id:kun432:20190830211632p:plain

実際に実行してみましょう。MacだとLinuxだとターミナルから実行が可能です。Windowsは・・・何かしら使ってください。

f:id:kun432:20190830212232p:plain

こんな感じで即座に試せます。そして、このコマンド内にAPIを実行するのに必要な情報が入っているので、これで必要なデータが取れるかを確認すればいいわけですね!

で、今回の場合は複数の条件で絞りたいわけです。

  • 部署:営業部
  • 担当社名:鈴木

こういう場合は"filterByFormula"というオプションを使って絞り込みます。ドキュメントは以下。

で、先に答えを書いてしまうとこんな感じになります。

filterByFormula=AND(name="鈴木", department="営業部")

ただ、これちょっとコマンドで実行しようと思うとのは面倒なので、実際にスキルを作りながら見てみましょう。

スキルの作成

エラー処理とかあまり考えなければこれだけです。

f:id:kun432:20190830224332p:plain

キモはIntegration BlockでAirtableのAPIを叩くところなので、それ以外のところをさらっと説明します。

変数は3つ。ユーザの発話から取得する担当者名(varName)・部署名(varDepartment)と、それらをAirtableに問い合わせて返ってきた内線番号(varNumber)ですね。

f:id:kun432:20190830223651p:plain

Speakで最初の発話です。

f:id:kun432:20190830231913p:plain

Interactionで担当者名と部署名を取得して変数に入れます。

f:id:kun432:20190830231933p:plainf:id:kun432:20190830231944p:plainf:id:kun432:20190830231954p:plain

Integrationは飛ばして、Ifです。ここで結果が0件だった場合のチェックをします。ちなみに、以前Googleスプレッドシートでレコード存在チェックしたときと違う書き方をしているのは、今回の場合、結果が帰ってこなかった場合はundefinedではなく0が入ったままになるようなので、それをチェックしています。(ここの0は、件数がゼロ、ということではなく、変数が初期化された際の0のままということです。)

f:id:kun432:20190830232414p:plain

最後に、内線番号が返ってきた場合とそうでない場合で発話を分けます。

f:id:kun432:20190830232621p:plainf:id:kun432:20190830232624p:plain

AirtableのAPIへリクエストを実行するIntegration Block

はい、今日のメインです。AirtableへAPIを実行するためにIntegration Blockを設定していきます。「Custom API」を選択します。

f:id:kun432:20190830234314p:plain

Airtableの検索のAPIはGETになります。

f:id:kun432:20190830235510p:plain

で、APIへのリクエストを設定していきます。必要なパラメータをAPIドキュメントから拾っていくとこんな感じになります。

リクエストURL

項目 備考
リクエストURL https://api.airtable.com/v0/ベースID/テーブル名 ベースIDとテーブル名は環境に合わせて設定してください

リクエストヘッダ

キー 備考
Authorization Bearer APIキー APIキーは環境に合わせて設定してください

リクエストパラメータ

キー 備考
filterByFormula AND(name="{varName}", department="{varDepartment}") {}のところは変数として設定してください

こんな感じになります。

f:id:kun432:20190830235530p:plain

f:id:kun432:20190830235539p:plain

結果を変数に割り当てる、Mapping Outputは一旦飛ばして、Test Integraionで実際にテストしてみましょう。

f:id:kun432:20190831000153p:plain

f:id:kun432:20190831000217p:plain

ちゃんと結果が返ってきてますね!ここで、取りたいのは、内線番号なので"number"の横のクリップボードをクリックします。この部分のデータにするためのキーがコピーされます。多分こんな感じです。

response.records.0.fields.number

では、これを変数とくっつけましょう。

ObjectPath Variable 備考
response.records.0.fields.number {varNumber} {}のところは変数として設定してください

f:id:kun432:20190831000705p:plain

はい、これで受け取った内線番号が{varNumber}に入ります。これでIntegration Blockも完了です!

テスト

f:id:kun432:20190831001027p:plain

はい、ちゃんと動いてますね!


いかがでしたか?Googleスプレッドシートに比べると、条件の付け方が独特だったりドキュメントが英語だったりするので、少し難しく感じるかもしれません。スプレッドシートではできない、複雑な検索などもできますので、本格的なデータベース用途で使うならこちらのほうが一枚上です。ドキュメント等を確認しながらいろいろ活用していただければと思います。

なお、Voiceflowの開発予定では、AirtableもIntegration Blockにビルトインされる予定になっていたので、将来的にはもっと使いやすい形になるとよいですね。