なんも分からないのでしらべた

なんもわからん!…ので、できる範囲で調べる。

GASへデータをPOSTし結果をjsonで受け取る時はリダイレクトされる

GoogleHomeのDialogflowを使ってSpreadsheetの値を読み上げたい。
先駆者の記事を見ると、基本的に読み上げはSpreadsheetとDialogflowの間にサーバーを噛まして実現している。
これをもっと簡易的に実現出来ないかと思った。

最近のQiitaの記事にて、DialogFlowからSpreadSheetに書きこみを行っている方がいた。
記事を参考に、単にGASの戻り値にspeechデータを含むJSONを返すようにすれば、SpreadSheetからのデータ読み上げもいけるのではと考え、調査した。

結果

この方法では読み出しはダメだった。

  • GASへPOSTし、Sheetへの書き込みは正常に実行される
    • 参考記事部分は正常に動作する
  • GASのdoPostに戻り値(JSONデータ等)を設定した場合、GAS側にて一度リダイレクトされる。
  • リダイレクトされた先でJSONデータが取得される、という仕組み。
    • つまり、直接取得はできない
    • DialogflowのFulfillmentのwebhookはリダイレクト対応してないと思われる。
      • webhookは下記のような「The document has moved」ページ(302エラー表示)のデータを取り出してしまう
      • dialogflow側で期待しているのはjsonデータなので、エラーが発生する
        • これが分かるまで非常に長かった…😂
<HTML>
<HEAD>
<TITLE>Moved Temporarily</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Temporarily</H1>
The document has moved <A HREF="https://script.googleusercontent.com/macros/echo?user_content_key=XXXX">here</A>.
</BODY>
</HTML>

参考

qiita.com

  • DialogflowからSpreadsheetに書きこむ

yamap55.hatenablog.com

  • GASのPOST基礎

既存の構成

qiita.com

  • SpreadSheetの間にサーバーを噛ましている例

終わりに

書き込みまではスルッと動くので、webhookでJSONデータがなぜ取り出せないか非常にハマった。 IFTTTにSpreadSheetの読み出しがあれば色々楽なんだけど…。