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>
参考
- DialogflowからSpreadsheetに書きこむ
- GASのPOST基礎
既存の構成
- SpreadSheetの間にサーバーを噛ましている例
終わりに
書き込みまではスルッと動くので、webhookでJSONデータがなぜ取り出せないか非常にハマった。 IFTTTにSpreadSheetの読み出しがあれば色々楽なんだけど…。