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」をクリックします。
「ワークスペース」の名前をつけます。ここでは「Company」にしました。
「ベース」を作成します。「+ Add a base」をクリックします。
メニューが出てきます。テンプレートから作成、スプレッドシートのインポート、まっさらから作成の3通りから選べます。今回はCSVを用意しましたのでそれをインポートしましょう。こんな感じのCSVファイルを用意してください。
name,department,number 鈴木,営業,001 佐藤,開発,101 田中,総務,201 橋本,カスタマーサポート,301 鈴木,カスタマーサポート,302 佐藤,総務,202
「Import a spreadsheet」をクリックします。
スプレッドシートのインポート画面が表示されますので、「Choose a .csv file」をクリックします。
アップロード画面が出ます。CSVをドラッグドロップしてください。
「Upload」をクリックして、アップロードします。
アップロードが終わると、「ベース」の名前を入力します。アイコンや色も変えれます。ENTERで終了します。
できた「ベース」を開いてみましょう。クリックします。
こんな感じでちゃんとインポートされてますねー。ちなみに上にExcelのシートのタブっぽいものが見えますが、これが「テーブル」になります。
テーブルの名前も適当に書き換えておきましょう。
Airtableがすごいのはここからです。右上のHELPをクリックして、"API Documention"をクリックします。
別のウインドウでAPIのドキュメントが開きます。真ん中に「ベース」のIDが表示されています。
下にスクロールしてみると、読み込んだレコードを取得するためのコマンドが表示されていますが、実行結果の例を見ると、さきほどアップロードしたデータの中身が表示されていますよね?一般的なAPIドキュメントだとだいたい例が用意されていて、それを読んで自分で必要なパラメータを設定して実行して結果を見る、という感じだと思うんですが、Airtableでは自分が用意したデータに合わせる形のAPIドキュメントが用意されるんですね、これは便利ですよね!
なので、右側に用意されているコマンドを実行すると実際の実行が見れます。で、コマンドの実行にはAPIキーが必要ですが、これも右上のチェックをクリックすると自動的にコマンドの中に設定されます。(APIキーは伏せてます)
実際に実行してみましょう。MacだとLinuxだとターミナルから実行が可能です。Windowsは・・・何かしら使ってください。
こんな感じで即座に試せます。そして、このコマンド内にAPIを実行するのに必要な情報が入っているので、これで必要なデータが取れるかを確認すればいいわけですね!
で、今回の場合は複数の条件で絞りたいわけです。
- 部署:営業部
- 担当社名:鈴木
こういう場合は"filterByFormula"というオプションを使って絞り込みます。ドキュメントは以下。
で、先に答えを書いてしまうとこんな感じになります。
filterByFormula=AND(name="鈴木", department="営業部")
ただ、これちょっとコマンドで実行しようと思うとのは面倒なので、実際にスキルを作りながら見てみましょう。
スキルの作成
エラー処理とかあまり考えなければこれだけです。
キモはIntegration BlockでAirtableのAPIを叩くところなので、それ以外のところをさらっと説明します。
変数は3つ。ユーザの発話から取得する担当者名(varName)・部署名(varDepartment)と、それらをAirtableに問い合わせて返ってきた内線番号(varNumber)ですね。
Speakで最初の発話です。
Interactionで担当者名と部署名を取得して変数に入れます。
Integrationは飛ばして、Ifです。ここで結果が0件だった場合のチェックをします。ちなみに、以前Googleスプレッドシートでレコード存在チェックしたときと違う書き方をしているのは、今回の場合、結果が帰ってこなかった場合はundefinedではなく0が入ったままになるようなので、それをチェックしています。(ここの0は、件数がゼロ、ということではなく、変数が初期化された際の0のままということです。)
最後に、内線番号が返ってきた場合とそうでない場合で発話を分けます。
AirtableのAPIへリクエストを実行するIntegration Block
はい、今日のメインです。AirtableへAPIを実行するためにIntegration Blockを設定していきます。「Custom API」を選択します。
Airtableの検索のAPIはGETになります。
で、APIへのリクエストを設定していきます。必要なパラメータをAPIドキュメントから拾っていくとこんな感じになります。
リクエストURL
項目 | 値 | 備考 |
---|---|---|
リクエストURL | https://api.airtable.com/v0/ベースID/テーブル名 | ベースIDとテーブル名は環境に合わせて設定してください |
リクエストヘッダ
キー | 値 | 備考 |
---|---|---|
Authorization | Bearer APIキー | APIキーは環境に合わせて設定してください |
リクエストパラメータ
キー | 値 | 備考 |
---|---|---|
filterByFormula | AND(name="{varName}", department="{varDepartment}") | {}のところは変数として設定してください |
こんな感じになります。
結果を変数に割り当てる、Mapping Outputは一旦飛ばして、Test Integraionで実際にテストしてみましょう。
ちゃんと結果が返ってきてますね!ここで、取りたいのは、内線番号なので"number"の横のクリップボードをクリックします。この部分のデータにするためのキーがコピーされます。多分こんな感じです。
response.records.0.fields.number
では、これを変数とくっつけましょう。
ObjectPath | Variable | 備考 |
---|---|---|
response.records.0.fields.number | {varNumber} | {}のところは変数として設定してください |
はい、これで受け取った内線番号が{varNumber}に入ります。これでIntegration Blockも完了です!
テスト
はい、ちゃんと動いてますね!
いかがでしたか?Googleスプレッドシートに比べると、条件の付け方が独特だったりドキュメントが英語だったりするので、少し難しく感じるかもしれません。スプレッドシートではできない、複雑な検索などもできますので、本格的なデータベース用途で使うならこちらのほうが一枚上です。ドキュメント等を確認しながらいろいろ活用していただければと思います。
なお、Voiceflowの開発予定では、AirtableもIntegration Blockにビルトインされる予定になっていたので、将来的にはもっと使いやすい形になるとよいですね。