質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Q&A

解決済

1回答

2343閲覧

Google App Script での BigQuery連携した際にデータが取得されない

piyoko_

総合スコア15

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

0グッド

0クリップ

投稿2018/10/08 04:14

Tera Tail質問メモ

前提・実現したいこと

Google App Scriptで、

  1. BigQueryと接続
  2. BigQuery.Jobs.query()でクエリを実行して結果のObjectを取得
  3. 結果Objectから文字列に変換

ということを行なっています。

2番目の工程で、BigQueryからObjectsを取得する操作をしたあと、
Objectsの中身が空のまま、3番目の工程に進んでしまいエラーになります。

発生している問題・エラーメッセージ

Stackdriver のError Reportingについて TypeError: undefined からプロパティ「f」を読み取れません。 make_message (コード) というエラーが表示されます。

該当のソースコード

Google

1# 本体のコード 2 var slackApp = SlackApp.create(token); 3 var projectID = 'hogehoge'; 4 var resource = { 5 query : 'hoge' # このクエリの動作は確認済み 6 } 7 var message = makeMessage(resource, projectID); 8 9# makeMssage 10function makeMessage(resource, projectID) { 11 var query_results = BigQuery.Jobs.query(resource, projectID); 12 var tableRows = query_results.getRows(); # この結果が空のまま次の処理が進んでしまう。 13 var message = make_message(tableRows); 14 return message; 15} 16 17# make_string 18function make_message(tableRows){ 19 var message = "``` hogehoge \n" ; # カラム名 20 message +=""+ tableRows[1].f[0].v +" "+tableRows[1].f[1].v +"% "+ tableRows[1].f[2].v +"%"+ "\n"; 21 message +=""+ tableRows[2].f[0].v +" "+tableRows[2].f[1].v +"% "+ tableRows[2].f[2].v +"%"+ "\n"+ "```"; 22 23 return message; 24} 25 26 27

試したこと

バッチ実行をしていますが、手動で2回実行すると、エラーが発生せずに成功します。

Queryの中身自体はBigQueryのGUI上で叩けば実行され、結果が取得されます。

補足情報(FW/ツールのバージョンなど)

 以上です。よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

BigQueryのQueryがもともと、一定のタイムアウトまでに取得できたらデータ列を返すという仕様です。

一方AppScriptでのBigQuery.jobs.query()は、タイムアウトを指定する方法を持っていない様子

このことから、↑のRun queryのセクションのように

javascript

1var query_results = BigQuery.Jobs.query(resource, projectID); 2var sleepTimeMs = 500; 3while (!query_results.jobComplete) { 4 Utilities.sleep(sleepTimeMs); 5 sleepTimeMs *= 2; 6 query_results= BigQuery.Jobs.getQueryResults(projectId, query_results.jobReference.jobId); 7}

このような待ち受けをするしかないのではないかと思われます。(未検証)

投稿2018/10/09 03:06

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

piyoko_

2018/10/09 10:51

papinaus様 ご回答ありがとうございます! 一旦、ご教授いただいた内容をスクリプトに追加して 手動実行したところ、上記のエラーが解消されました! ただし複数回実行したため、 バッチ実行時にもエラーが出ないか、明日確認いたします。 取り急ぎ、ご連絡まで!! ありがとうございます!
papinianus

2018/10/09 10:58

吉報をおまちします
piyoko_

2018/10/10 06:13

papinianus様 本日、バッチ実行でも無事に回りました。 ご回答いただいて、本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問