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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

388閲覧

GASを使いAPIで取得したデータを扱う方法がわかりません。

nari3

総合スコア2

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2023/04/21 02:38

編集2023/04/21 04:51

実現したいこと

最終的にやりたいことは、APIで取得したデータをスプレッドシートに入力することなのですが、その段階にたどり着く前に躓いています。
現時点で疑問に思っていることを解決したいです。

前提

最近GASを使い始めた者です。これまでプログラミングの業務経験、学習経験はなく、HTML、CSSの知識が多少ある程度です。ここで質問ができるレベルの知識すら持ち合わせていないように思いますが、全く前に進めなくなってしまったので質問させていただきました。

GASを使いAPIで取得したデータを扱う方法がわかりません。
最終的にやりたいことは、APIで取得したデータをスプレッドシートに入力することなのですが、その段階にたどり着く前に躓いています。

APIを利用してデータを取得するため以下のようなコードを、スプレッドシートに紐づくコンテナバインドスクリプトとして作成しました。

var ApiUrl = 'https://apiurl' var res = UrlFetchApp.fetch(ApiUrl).getContentText(); var res_json = JSON.parse(res); console.log(res_json);

この時点で,console.logで以下のような形式のデータが取得できていることが確認できました。

{ request: { parameters: { api_id: 'apiid', username: 'USERNAME', email: 'xyz@example.jp', output: 'json' } }, result: { status: 200, result_count: 1, items: [ [Object] ] } }

ここから先ほどのコードに追記して

var ApiUrl = 'https://apiurl' var res = UrlFetchApp.fetch(ApiUrl).getContentText(); var res_json = JSON.parse(res); var res_json_result1 = res_json.result; console.log(res_json_result1);

この時点で出力されるログが

{ status: 200, result_count: 1, items: [ { p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: [Object], iteminfo: [Object] } ] }

コードをさらに進めて

var ApiUrl = 'https://apiurl' var res = UrlFetchApp.fetch(ApiUrl).getContentText(); var res_json = JSON.parse(res); var res_json_result1 = res_json.result; var res_json_result2 = res_json_result1.items; console.log(response_json_result2);

ここで出力されるログは以下のような形式でした。

[ { p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } } ]

このように、1段階ずつ掘り進めれば全てのデータに辿り着けるのではと思い、コードを以下のように記述しました。

var ApiUrl = 'https://apiurl' var res = UrlFetchApp.fetch(ApiUrl).getContentText(); var res_json = JSON.parse(res); var res_json_result1 = res_json.result; var res_json_result2 = res_json_result1.items; var res_json_result3 = res_json_result2.iteminfo; console.log(res_json_result3);

すると、ログがundefinedとなってしまいました。

試したこと

console.log(res_json_result1.status)

 →200と返ってきます。

console.log(res_json_result2.username)

 →undefinedと返ってきます。

res_json_result1.itemsが正しく取得できたのにres_json_result2.iteminfoがundefinedになり、データ形式がitems[]だったのに対しiteminfo{}だったため、もしかしてデータが{}で囲われてるとundefinedになって[]ならいけるのでは?と思い(その前に取得できていたres_json.result;はresult{}だったので関係なさそうだとは思いましたが、、)

console.log(response_json_result2);

の結果返ってきた

[ { p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } } ]

上記のデータを

p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: [ start: '2022-11-5', finish: '2022-11-11' ] iteminfo: [ data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] ]

このような形に変換しようと思い

response_json_result2b = response_json_result2.replace("[{" , "");

このようにしたところ
TypeError: response_json_result2.replace is not a function
とエラーになってしまいました。

まとめると、わからないのは

  • res_json_result1.items;まではデータが正しく取得できるのにres_json_result2.iteminfo;でundefinedになるのはなぜなのか

  • replaceできなかったのはなぜなのか

  • 正しくデータを取得するにはどうしたらいいのか

です。

正しく質問できているかわからないのですが、ご教示いただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

res_json_result1.items;まではデータが正しく取得できるのにres_json_result2.iteminfo;でundefinedになるのはなぜなのか

res_json_result1.itemsは結果を複数含む配列データとなります。
なので、配列にiteminfoという項目はないとエラーになっています。

replaceできなかったのはなぜなのか

問題は上記のように配列データを配列として扱ってないことによるものです。
またresponse_json_result2をログに出力した場合分かりやすく文字列として表示されていますが実際には文字列データではありません。
なのでreplaceというfunctionが存在しないとエラーになっています。
また下手に値を変更することはデータ構造を変更することになるので行うべきではありません。

正しくデータを取得するにはどうしたらいいのか

上記説明のようにres_json_result2は配列データとなっています。
なので
var res_json_result3 = res_json_result2[0]
といった感じで配列の何番目のデータかを指定する必要があります。

投稿2023/04/21 04:12

YAmaGNZ

総合スコア10258

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

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

nari3

2023/04/21 05:07

ご回答ありがとうございます。 重ね重ね無知な質問をして大変恐縮なのですが >結果を複数含む配列データ とは、どういった状態のデータを指すのでしょうか? つまりres_jsonやres_json.resultは「結果を複数含む配列データ」ではなかったため、質問内で書いたやり方でデータが取得できたということですよね。 これらとres_json_result1.itemsの何が違うことでこうなっているのかがわからず、、、 replaceできなかった理由は、そもそもreplaceは文字列データに対して機能するもので、今回のデータは配列データのため機能しなかったということですね。ありがとうございます。 >配列の何番目のデータかを指定する必要があります。 ご指摘の通り、何番目のデータかを指定してログ出力したところ console.log(res_json_result2[0]) これで以下のログが返されました。 { p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } } これはconsole.log(response_json_result2)で返ってきた値の一番外側の[]がない状態と同じですが、配列の番号を指定するとなると、res_json_result2 つまりres_json_result1.itemsの0番目のデータがp_code: 'xxx'、1番目のデータがp_name: ''の部分になるのかと思っていましたが、私の配列編理解が間違っているでしょうか。console.log(res_json_result2[1]がundefinedだったので当然間違っているだろうとは思っています、、、
YAmaGNZ

2023/04/21 05:25

JSONで配列データを示すのに[]を使用します。 今回で言うと { p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } } という構造のデータを複数格納することができる形でのものとなります。 今回は [{ p_code: 'xxx', p_name: '', username: 'USERNAME', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } }] と1つのデータしか含まれない形ですので[1]がなくundefinedとなります。 [{ p_code: 'xxx', p_name: '', username: 'USERNAME1', email: 'xyz@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } }, { p_code: 'yyy', p_name: '', username: 'USERNAME2', email: 'aaa@example.jp', date: { start: '2022-11-5', finish: '2022-11-11' } iteminfo: { data1: [Object], data2: [Object], data3: [Object], data4: [Object], data5: [Object] } }] といった感じで複数のデータが返される可能性があるということとなります。 この場合、 res_json_result2[0].pcodeが'xxx'となり res_json_result2[1].pcodeが'yyy'となります。 返されるJSONデータはそのAPIの仕様として定義されているでしょうからそちらを確認してください。
nari3

2023/04/21 06:09

自分のような初心者にもわかり易く説明してくださり本当にありがとうございます。 配列というものを理解できていなかったのと、オブジェクトと配列をごっちゃにしていたことにも気づくことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問