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

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

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

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

API

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

Q&A

解決済

1回答

899閲覧

YouTube APIにリクエストを送って返ってくる値の順番について

Kodanosuke

総合スコア42

Google Apps Script

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

API

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

0グッド

1クリップ

投稿2020/06/05 02:02

前提・実現したいこと

以下のアドレスを用いてyoutube apiに動画のplaylistの情報をリクエストしたところ,以下のアドレスに記載した順番通りにJSONが返ってきません.リクエストのたびに順番は異なっているようです.id=に記載した順番と返ってくるJSONの順番をあわせる,もしくはでてきた情報とplaylist IDを紐付けたいです.
この情報をあとで順番通りにスプレッドシートを書き込むことを想定しているため,順番が毎回異なるため意図したシートに書き込めません.どのようにしたらよろしいでしょうか.ご教授いただけると幸いです.
https://www.googleapis.com/youtube/v3/channels?part=contentDetails,statistics&id=UCZf__ehlCEBPop-_sldpBUQ,UCibEhpu5HP45-w7Bq1ZIulw,UC2GuoutVyegg6PUK88lLpjw,UCWcEgYIOqq1BVr4Qm1sPuVg,UCmZA7XRRzmxhM4jPltZX1Zg,UCD-miitqNY3nyukJ4Fnf4_A,UCWtLzcASRAjlVhKibLUCuEw&key=**********************

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

特になし

該当のソースコード

GAS

1function getPlayListInfo(playlistID,baseURL,APIkey){ 2 // playlistのstatistics&contentsDetail取得用のURL生成 3 var playlist_url = baseURL + "playlistItems?part=snippet&playlistId=" + playlistID + "&maxResults=50&key=" + APIkey 4 5 Logger.log(playlist_url) 6 7 // videoの各種データ取得 8 var playlist_response = UrlFetchApp.fetch(playlist_url) 9 10 var playlist_json = JSON.parse(playlist_response.getContentText()); 11 12 return playlist_json 13 14}

試したこと

playlistのIDをキーとして連想配列にしようと思いましたが,キーが重複したりしてうまくいっていません.

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは、以下のようにすれば順番通りのデータが取得できると思います。

GAS

1function getChannels() { 2 var key = "";//apiのキー 3 var ids = "UCZf__ehlCEBPop-_sldpBUQ,UCibEhpu5HP45-w7Bq1ZIulw,UC2GuoutVyegg6PUK88lLpjw,UCWcEgYIOqq1BVr4Qm1sPuVg,UCmZA7XRRzmxhM4jPltZX1Zg,UCD-miitqNY3nyukJ4Fnf4_A,UCWtLzcASRAjlVhKibLUCuEw"; 4 var url = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails,statistics&id=" + ids + "&key=" + key; 5 //これは配列[]になっています。 6 //上のidsの順番通りになります。 7 //items[].dataにはリクエストしたjsonのデータが入っています。 8 var items = ids.split(/,/).map(function(id){ 9 return { 10 id: id, 11 //data: {} 12 }; 13 }); 14 Logger.log(url); 15 var req = UrlFetchApp.fetch(url) 16 var json = JSON.parse(req.getContentText()); 17 18 json.items.forEach(function(request_data){ 19 items.some(function(item){ 20 if(item.id === request_data.id){ 21 item.data = request_data; 22 return true; 23 } 24 }); 25 }); 26 Logger.log(items.length); 27 Logger.log(items); 28 //Logger.log(items[0].data); 29 //Logger.log(items[1].data); 30 //Logger.log(items[2].data); 31}; 32

投稿2020/06/06 12:44

fake_shibe

総合スコア806

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

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

Kodanosuke

2020/06/07 02:58

ありがとうございます! 非常に助かりました. 少し質問させてください. >> var items = ids.split(/,/).map(function(id){ return { id: id, //data: {} }; }); と >> json.items.forEach(function(request_data){ items.some(function(item){ if(item.id === request_data.id){ item.data = request_data; return true; } }); }); の部分についてです. 上の方ではidという名前の連想配列を準備しているようですが,下の方ではどのような処理となっているのか教えていただきたいです. jsonとitemという連想配列をどのように使っているのでしょうか. よろしくおねがいします.
fake_shibe

2020/06/07 07:15

var items = ids.split(/,/).map(function (id) { return { id: id, //data: {} ここにyoutubeのAPIで取得したデータが入ります。 }; }); ですが、コンマ区切りのIDを配列に変換しています。 idが順番どうりに配置され、以下のようなかんじに出力されます。 [ {id:"UCZf__ehlCEBPop-_sldpBUQ"}, {id:"UCibEhpu5HP45-w7Bq1ZIulw"} ] この中にAPIで取得したデータを入れていきます。 //youtubeのAPIでリクエストしたデータが配列になっているのでforEachで回します。 json.items.forEach(function (request_data) { //上で準備した配列をsomeを使いループ処理します。 items.some(function (item) { //上で準備したID(item.id)とAPIでリクエストしたデータのID(request_data.id)が一致した場合 if (item.id === request_data.id) { //上で準備していた配列のIDが一致している場所にAPIで取得したrequest_dataを入れます。 //{ id:"UCZf__ehlCEBPop-_sldpBUQ", data: request_data} のようになります。 item.data = request_data; // return true; してやることで someのループ処理を終えます。 for, whileのbreakにあたると思います。 return true; } }); }); ちょっと分かりにくい説明かもしれませんが上のような感じになります。 jsonで取得したデータをループで回して、上で準備していた配列(順番どうりになっている)のidが同じ場合に、上で準備していた配列にデータを入れるという感じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問