Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Airtableをスキル開発で試してみた / Alexa with Airtable

Airtableをスキル開発で試してみた / Alexa with Airtable

【大阪】スマートスピーカーミーティング 2019/03/28 のLTの資料です。Airtableを使ったAlexaスキル開発について話してきました。

https://osaka-driven-dev.connpass.com/event/122666/

Kuniaki Shimizu

March 28, 2019
Tweet

More Decks by Kuniaki Shimizu

Other Decks in Programming

Transcript

  1. My Skills 5 - Alexa (JP): 8 - Google: 1

    - Clova: 1 100個までの道のりは長い、、、 - Alexa (US): 1
  2. 7

  3. 11

  4. 17

  5. 19 • 2015年にスタートした、サンフランシスコのスタートアップ企 業のサービス • 「Excel/Google Sheets + Access」をブラウザで ◦

    スプレッドシートの見た目でデータベースが使える • 無料プラン ◦ データベース数無制限 ◦ 1データベースあたり1200レコードまで ◦ 多数のテンプレートをベースにするもOK、イチから作成 するもOK(テンプレートはほんと多数) ◦ API経由で操作可能 • InvocableやVoiceflowでの連携例あり
  6. 20 • 2015年にスタートした、サンフランシスコのスタートアップ企 業のサービス • 「Excel/Google Sheets + Access」をブラウザで ◦

    スプレッドシートの見た目でデータベースが使える • 無料プラン ◦ データベース数無制限 ◦ 1データベースあたり1200レコードまで ◦ 多数のテンプレートをベースにするもOK、イチから作成 するもOK(テンプレートはほんと多数) ◦ API経由で操作可能 • InvocableやVoiceflowでの連携例あり!
  7. 23

  8. 26

  9. 27

  10. 28

  11. 29

  12. 30

  13. 31

  14. 32

  15. 33

  16. 34

  17. 36 const Alexa = require('ask-sdk-core'); const Airtable = require('airtable'); const

    airtable_key = ‘XXXXXXXXXXXXXXX’; // APIキー const base_id = 'XXXXXXXXXXXXXXX'; // データベースID const base = new Airtable({ apiKey: airtable_key }).base( base_id ); ・・・ ・・・ "aws-sdk": "^2.326.0", "airtable": "^0.5.10" } } - package.json - index.js
  18. 38 const StatusCodeIntent = { canHandle(handlerInput) { ・・・ }, async

    handle(handlerInput) { ・・・ let searchResult = await base('status codes').select({ // status codes filterByFormula: "{Status}='" + codeValue + "'", // テーブルのStatus maxRecords: 1, // を指定のキー }).all(); // で検索 - index.js (続き) • APIドキュメント通りにやると、非同期の制御ができなかった • Airtableのフォーラムで似たようなことを問い合わせている人が いたので、それを参考にさせてもらったらできた! • ここにたどり着くのに3,4日、、、JSもっと勉強しないと • ドキュメントよりもシンプルにかけたので良しとする
  19. 39 [{ "_table": { "_base": { "_airtable": { "requestTimeout": 300000

    }, "_id": "appPphK8s2uEGZQex" }, "id": null, "name": "status codes" }, "id": "rece7SAufplQwURiK", // レコードID(UPDATE/DELETEで必要) "_rawJson": { "id": "rece7SAufplQwURiK", "fields": { "Status": "404", "Desc": "Not Found(未検出)" }, "createdTime": "2019-03-25T12:00:12.000Z" }, "fields": { "Status": "404", "Desc": "Not Found(未検出)" } }]
  20. 40 if( searchResult.length > 0 ){ const speechText = `ステータスコード${codeValue}は、`

    + ${searchResult[0].fields.Desc}、です。`; return handlerInput.responseBuilder .speak(speechText) .getResponse(); } else { const speechText = `ステータスコード${codeValue}は登録されていません。`; return handlerInput.responseBuilder .speak(speechText + promptText) .reprompt(promptText) .getResponse(); } - index.js (続き)
  21. 41

  22. まとめ 47 - お手軽データベース - 見た目も綺麗で、普通の人が更新しやすい - チームでスキルの開発・運用ができる(これ重要!) - 開発の取っ掛かりとしては揃っている

    - 動的なAPIドキュメント - フォーラム等も活発 - 無料プランで結構使える - 制限だけ注意 - 最大1200件だとINSERTが多いと頭打つかも(有料ならOK) - 5リクエスト/秒を超えると30秒アクセス不可 - その他 - 有料プランならグラフも作成できる(BI) - Googleスプレッドシートもおすすめ!
  23. 52