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

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

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

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

Q&A

解決済

2回答

1303閲覧

変数に代入したJSONオブジェクトを読み取れない

ryudaiii

総合スコア6

Google Apps Script

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

0グッド

0クリップ

投稿2021/04/05 10:27

編集2021/04/05 10:41
var projectId = 'webapp-ccdf0'; var firestore = FirestoreApp.getFirestore(email, key, projectId); var sheet = SpreadsheetApp.getActiveSheet(); var data = firestore.getDocuments('deliverys'); var json = JSON.stringify(data, undefined, 1); function getPickupBlue(json) { return json.fields.pickups.mapValue.fields.blue.stringValue; } console.log(getPickupBlue(json)); data.forEach((json) => { console.log(json) }) // const row = 2 // const rowNum = json.length // const colNum = json[0].length // sheet.getRange(row, 1,rowNum, colNum).setValues(json) }

jsonの宣言のところはご教示いただいたものではありませんが先ほどご教示いただいたものでも試しましたが同じような結果になりました。

エラーコードは、TypeError: Cannot read property 'pickups' of undefined です。

一応dataの構造も画像でイメージ説明載せておきます。

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

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

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

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

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

mather

2021/04/05 10:31

質問は編集できますので、追記するだけなら新しい質問を投稿しないようにしましょう。
ryudaiii

2021/04/05 10:35

申し訳ありません。次から気をつけます。
Automatic9045

2021/04/05 10:39

元の質問で回答した者です。 元の質問から派生した質問のため、質問者さんに新しく質問を投稿するようにお願いしました。 @質問者さん タイトルから内容を推察出来ない(後から同じ疑問をもったユーザーが見つけられない)ので、タイトルを変更した方が良いです。 「変数に代入したJSONオブジェクトを読み取れない」など、具体的なタイトルにしておいて下さい。
ryudaiii

2021/04/05 10:40

わかりました。 変更しておきます。
Automatic9045

2021/04/05 10:44

私の回答に合わせて変数jsonの定義を変えた上で、エラーが発生している箇所を教えて下さい。どの部分ですか?
ryudaiii

2021/04/05 10:46

TypeError: Cannot read property 'pickups' of undefined やはりこのエラーが出てしまいます。
Automatic9045

2021/04/05 10:48 編集

まず、そのエラーはコードの何行目で出ているかが表示されていると思うので確認して下さい。何行目でしたか?
mather

2021/04/05 10:49

var data = ... の次の行で console.dir(data); をしてみてください。おそらくdataは配列だと思います。
ryudaiii

2021/04/05 10:49

getPickupBlue @ コード.gs:12 myFunction @ コード.gs:15 こう出ています。この場合は12行目、returnから始まる行になるのでしょうか??
Automatic9045

2021/04/05 10:51

matherさんの仰る通り、dataが配列になっているのが原因ですね。 追記しておきます。
ryudaiii

2021/04/05 10:51

matherさんありがとうございます。 実行してみたところ、console.dir is not a function というエラーが出ました。
mather

2021/04/05 10:59

実行環境の問題ですね…失礼。 console.log(JSON.stringify(data)); で良いです。
ryudaiii

2021/04/05 11:04

matherさんありがとうございます!! お二人のおかげで無事解決できました!! 本当にありがとうございました!!
guest

回答2

0

まず、 json 変数を多くの意味で使いすぎです。どこでバグを生むかわからないので、一つ一つ意味を整理しながら変数名を決めましょう。

// データが何であるか変数名に書いておくと読みやすくなります。(複数形のスペルが違いますね) var deliveries = firestore.getDocuments('deliverys'); // 引数の名前は他で使われていないものが良いです function getPickupBlue(deliveryData) { return deliveryData.fields.pickups.mapValue.fields.blue.stringValue; } // 複数形の forEach で単数形を使うなど工夫すれば何を操作しているのか理解しやすくなると思います。 deliveries.forEach((delivery) => { console.log(getPickupBlue(delivery)); })

投稿2021/04/05 11:10

mather

総合スコア6759

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

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

ryudaiii

2021/04/05 11:15

とてもわかりやすい解説ありがとうございます!!! 今後に生かしていこうと思います!! スペルミスは恥ずかしい限りです。。。
guest

0

ベストアンサー

先程の質問でも回答した者です。
原因は2つあります。

1. JSON.stringifyしているため

JSON.stringifyによって、変数jsonにはJSONオブジェクトを文字列化したものが代入されてしまっています。
JSONオブジェクトをコピーするには、JSON.stringifyしたものを再度JSON.parseします。

JavaScript

1var json = JSON.parse(JSON.stringify(data));

あるいは、コピーの必要が無いのならばそもそもdataを加工せずにそのまま使っても良いと思います。

2. 変数jsonが配列になっているため

getDocumentsは複数のdocumentを配列の形で返してくる関数だったようです。
ですから、1つめのdocumentのみを取り扱うのなら以下のように書けば解決するはずです。

JavaScript

1var json = data[0];

2つめ以降のdocumentも取り扱いたい場合はforeach文などを使えばOKです。

投稿2021/04/05 10:29

編集2021/04/05 10:56
Automatic9045

総合スコア313

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

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

ryudaiii

2021/04/05 10:31

文字列になってしまっていたんですね、、、 ありがとうございます! 具体的にはどのような変更の余地がありますでしょうか??
ryudaiii

2021/04/05 10:36

本当にありがとうございます!!!
ryudaiii

2021/04/05 10:38

すみません、、解決に至らなかったです、、、
Automatic9045

2021/04/05 10:45

いくつかの原因が積み重なっているようです。 一先ず、原因の1つはこれで解決しました。他の原因がどこにあるか探していきましょう。
ryudaiii

2021/04/05 10:59

追記していただきありがとうございます! こちらのコードを書くのは、getDocumentsの下の行でよろしいでしょうか??
Automatic9045

2021/04/05 11:00

そうです。変数jsonを定義している部分ですね。
ryudaiii

2021/04/05 11:03

できましたあああ!! 本当にありがとうございます!!
Automatic9045

2021/04/05 11:25 編集

良かったです! 最後にいくつか。 ・matherさんの仰っている通り、変数json、変数dataはその名前から役割を推察しづらいので改名した方が良いです。 ・「[0]」を付けると動く理由は分かりましたか?書いたコードを理解することが次に繋がります。 ・提示されたコードを見るに、今回のケースでは「getPickupBlue」として別関数化する必要は無いようです。 今日は朝からひたすら原因究明で大変でしたね。お疲れ様でした。
ryudaiii

2021/04/05 11:26

・「[0]」を付けると動く理由は分かりましたか?書いたコードを理解することが次に繋がります。 ここに関しては、理解しきれていないのでこのあとお勉強します。笑 いやいやこちらこそこんな無能に最後まで親身になって付き合ってくださりありがとうございました!! 今までで一番の達成感かもしれません。笑
Automatic9045

2021/04/05 11:44

[0]に関しては是非勉強しておいて下さい。時間はかかるかもしれませんが、理解しておくと今後本当に役に立ちます。 最終的に解決できて良かったです。こういう時の達成感、分かります笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問