kun432's blog

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

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

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

Voiceflow夏休みAdvent Calendarの19日目です。

Googleスプレッドシート連携シリーズの最終回です。検索・登録・更新機能まで実装した「ゼロカロリースキル」、最後に「削除」機能を追加したいと思います。これで一通りの連携はできたことになりますね!

前回のあらすじはこちら。

kun432.hatenablog.com

ではまずスキルの実行イメージから。


アレクサ、「ゼロカロリースキル」をひらいて

ゼロカロリースキルです。カロリーを知りたい食べ物の名前を言ってください

カツカレーを削除

カツカレーは、カツとカレーのカロリーが相殺されるから、という理由で、現在登録されています。削除してもよろしいですか?

はい

カツカレーを削除しました。カロリーを知りたい食べ物の名前を言ってください・・・


さぁ、では最後も張り切ってやっていきましょう!

スキルの全体図

f:id:kun432:20190819234034p:plain

結構大きくなりましたねー。各フローごとに分けるとこんな感じになります。

f:id:kun432:20190819234114p:plain

これまで同様に、削除用のフローを別に追加します。もう慣れてきましたよね?線が見えにくくなってきたので、今回はちょっと左に配置してみました。

では順にやっていきます。

削除用インテントの追加

前回同様、最初の方のInteraction Blockに削除用のインテントを追加します。もう慣れてきましたよね?サラッと行きましょう。

f:id:kun432:20190819234855p:plain

Slotsタブは変更不要です

f:id:kun432:20190819235003p:plain

Intentsタブは、削除用インテント"delete_intent"を追加して、以下のようなサンプル発話を登録します。

f:id:kun432:20190819235016p:plain

Choicesタブは、先ほど作成した"delete_intent"を選択して、マッピングは他と同じく、スロット"[slot_recipe]"と変数"{varRecipe}"を紐付けて、食べ物名を取得します。

f:id:kun432:20190819235027p:plain

はい、これで更新用フローへの流れができました。

f:id:kun432:20190819235416p:plain

削除フローの作成

で、ここから更新用フローのブロックを並べていきますが、先程のスキル実行イメージ見ていただくとわかると思うのですが、更新フローとよく似てますよね???

f:id:kun432:20190820001056p:plain

ということで、ここは更新フローをまるっとコピーして、いらないものを消して、修正すれば良さそうですね!やってみましょう。Shiftキーを押しながら、更新フローを全部覆うようにドラッグして、WindowsならCtrl+C、MacならCommand+Cでしたね!

f:id:kun432:20190820001850p:plain

上の方に以下のように表示されればコピーされています。

f:id:kun432:20190820002016p:plain

で、少しCanvasを動かして、ペーストします。WindowsならCtrl+V、MacならCommand+Vです!

f:id:kun432:20190820002621p:plain

はい、では線をつないで順に見ていきます。

f:id:kun432:20190820002916p:plain

最初の4ブロックは、削除しようとした食べ物名がスプレッドシートに存在するかのチェックなので、ほぼ修正不要です。スプレッドシートに登録されていなかった場合のSpeak Blockのところだけ「更新」から「削除」に変えればよいです。

f:id:kun432:20190820004055p:plain

次の2ブロック、ここは更新時に「理由」を受け取るための、発話の説明とインテントの部分なので、不要ですね。2つとも削除して前のIf Blockからつなげちゃいましょう。

f:id:kun432:20190820004802p:plain

f:id:kun432:20190820004814p:plain

f:id:kun432:20190820004827p:plain

次に削除の確認の為の発話のところも修正します。以下のような感じにしてください。

f:id:kun432:20190820021714p:plain

次のInteraction Blockは「はい」「いいえ」を受け取るためなのでそのままでいいですね。

f:id:kun432:20190820005333p:plain

Integration BlockでGoogleスプレッドシートからのデータ削除

「削除してもよろしいですか?」「はい」と流れてきたら、いよいよIntegration BlockでGoogleスプレッドシートから削除します。現在は、更新フローからコピーしてきたので、"Update Data(更新)"になっています。これを"Delete Data(削除)"にしていきます。順にやっていきましょう。

f:id:kun432:20190820005721p:plain

"Delete Data"をクリックします。

f:id:kun432:20190820010303p:plain

Googleアカウントはこれまでと同じく選択するだけです。

f:id:kun432:20190820010332p:plain

スプレッドシートの設定も一旦消えるので、これまでと同じように設定してください。

f:id:kun432:20190820010347p:plain

で、削除するデータの条件ですが、入力項目が2つ見えますね?

f:id:kun432:20190820010527p:plain

書いてあることをそのまま読むと、「削除したい最初の行番号」と「削除したい最後の行番号」と書いてあります。これだけ見ると何行目から何行目まで消す、というふうに読めますね?じゃあ1行だけ消したい、例えば、8行目だけ消したい場合はどうすればよいでしょうか?

8行目だけならこうじゃない?

f:id:kun432:20190820010923p:plain

普通そう思いますよね?私もそう思ってた時代がありました・・・・ですが、残念ながら不正解です。8行目だけ消したい場合はこうします。

f:id:kun432:20190820011712p:plain

+1するんですね・・・なので逆に言うと、8・9行目をまとめて消したい場合はStart Rowが8、End Rowが10となるはずです(未確認)

わかりにくい・・・😣😣😣

けど、まあこれが現実なんでしょうがないです。とりあえず設定の仕方がわかりました。で、更新の時を思い出してほしいんですが、更新するときは行番号を指定して更新してましたよね。そのために更新フローの最初のIntegration Blockで検索した際に"varRowNum"で行番号を取っています。

削除フローは更新フローをコピーしてきたので、このあたりは同じになっているはずです。よって、削除時はこうすればよいはずですね?

f:id:kun432:20190820012403p:plain

はい、残念ながらこれも不正解です。というか、

これは絶対しちゃダメ!!!😡😡😡

なぜかというと、ここ、こういう計算式入らないのです・・・つまりこうなります。

Start Row: 8
End Row: "8 + 1"

で、どういう事が起きるかというと、

指定した行以降が全部消えます・・・😱😱😱

怖い・・・ということで、ここはきちんと処理してあげないといけません。順にやっていきましょう。

まず変数を作ります。ここでは"varRowNumEnd"としました。

f:id:kun432:20190820013135p:plain

で、Integration BlockとInteraction Blockの間に一つSet Blockを差し込みます。

f:id:kun432:20190820013605p:plain

Set Blockの設定は以下の通りに実施します。まず "Set to:" のところでドロップダウンから"{varRowNumEnd}"を選択し、入力欄の右端の""をクリックして、出てきたメニューから"Expression"を選択します。

f:id:kun432:20190820014407p:plain

入力欄が "Enter your expression here" になるので、以下のように入力します。

f:id:kun432:20190820014553p:plain

はい、これで、"{varRowNum}" に入った行数にプラス1した行数が"{varRowNumEnd}"に入るというわけですね。あとはこれをIntegration Blockの設定に入れればよいだけです。

f:id:kun432:20190820014822p:plain

では、ここでTest Integrationでテストしてみましょう、という前に今のスプレッドシートの状態を確認しておきます。

f:id:kun432:20190820015118p:plain

真ん中にある5行目のポテトチップスを削除してみましょう。更新時と同じく、削除も実データの削除になりますので、警告が表示されます。Confirmをクリックします。

f:id:kun432:20190820015405p:plain

テスト用のフォームが出ます。5行目を消したい場合は、"{varRowNum}"が5、"{varRowNumEnd}"が6でしたよね。それぞれ入力してRUNをクリックします。

f:id:kun432:20190820015605p:plain

以下の通り、"Deleted"と表示されれば成功です。削除した行番号も出てますね。

f:id:kun432:20190820015719p:plain

スプレッドシートも見てみましょう。

f:id:kun432:20190820020023p:plain

はい、きちんと消えていますので、削除もこれでOKですね!

追記:上記はドキュメント等にも載っておらず、色々試行錯誤して見つけた次第です。現在、開発元には確認中ですので、確認が取れ次第、この記載を削除します。それまでは非公式だと認識してください。

あとは細かい修正だけです。

Integration Blockの後ろのSpeak Blockはそれぞれ「成功時」「失敗時」のメッセージですので、ここも「更新」から「削除」にしてください。

f:id:kun432:20190820020553p:plain

f:id:kun432:20190820020606p:plain

はい、では最後に、削除フローから、最初の検索のIntegration Blockに戻る線をまとめて引いちゃいましょう。

f:id:kun432:20190820020849p:plain

はい、これですべて終了です。お疲れさまでした!

テスト

では、いよいよテストです。

f:id:kun432:20190820022051p:plain

最初に検索で出てきたものが、削除したあとは出てこなくなったのがわかりますね!うまくいきました!

まとめ

Googleスプレッドシート連携で作るゼロカロリースキルもどき」シリーズ、いかがでしたか?検索・登録・更新・削除、とGoogleスプレッドシートでできることは 一通り網羅できたのではないかなと思います。ただし、まだまだ改善点は残されています。

  • フローがかなり見にくくなっている。Flow Blockなどを使って処理を分割して見やすく。
  • エラーチェックが甘い。例えば、削除と更新ではそれぞれ事前に存在チェックをしているが、登録ではやっていない。
  • Interaction Blockで想定していない発話が来た場合の処理はやっていない。
  • 「ヘルプ」や「ストップ」はまだ対応していない。

などなど。実際にスキルを申請する際にはこういったところも対応していく必要があります。もしお時間があれば、ぜひそのあたりもトライしてみてください。

Googleスプレッドシートを簡易データベース的に使うと、スキル開発の幅が広がりますので、ぜひ活用してみてください!