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

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

ただいまの
回答率

87.59%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 305

score 37

前提・実現したいこと

以下のアドレスを用いて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=******************

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

特になし

該当のソースコード

function getPlayListInfo(playlistID,baseURL,APIkey){
  // playlistのstatistics&contentsDetail取得用のURL生成
  var playlist_url = baseURL + "playlistItems?part=snippet&playlistId=" + playlistID + "&maxResults=50&key=" + APIkey

  Logger.log(playlist_url)

  // videoの各種データ取得
  var playlist_response = UrlFetchApp.fetch(playlist_url)

  var playlist_json = JSON.parse(playlist_response.getContentText());

  return playlist_json

}

試したこと

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

function getChannels() {
    var key = "";//apiのキー
    var ids = "UCZf__ehlCEBPop-_sldpBUQ,UCibEhpu5HP45-w7Bq1ZIulw,UC2GuoutVyegg6PUK88lLpjw,UCWcEgYIOqq1BVr4Qm1sPuVg,UCmZA7XRRzmxhM4jPltZX1Zg,UCD-miitqNY3nyukJ4Fnf4_A,UCWtLzcASRAjlVhKibLUCuEw";
    var url = "https://www.googleapis.com/youtube/v3/channels?part=contentDetails,statistics&id=" + ids + "&key=" + key;
    //これは配列[]になっています。
    //上のidsの順番通りになります。
    //items[].dataにはリクエストしたjsonのデータが入っています。
    var items = ids.split(/,/).map(function(id){
        return {
            id: id,
            //data: {}
        };
    });
    Logger.log(url);
    var req = UrlFetchApp.fetch(url)
    var json = JSON.parse(req.getContentText());

    json.items.forEach(function(request_data){
        items.some(function(item){
            if(item.id === request_data.id){
                item.data = request_data;
                return true;
            }
        });
    });
    Logger.log(items.length);
    Logger.log(items);
    //Logger.log(items[0].data);
    //Logger.log(items[1].data);
    //Logger.log(items[2].data);
};

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/07 11: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という連想配列をどのように使っているのでしょうか.

    よろしくおねがいします.

    キャンセル

  • 2020/06/07 16: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が同じ場合に、上で準備していた配列にデータを入れるという感じです。

    キャンセル

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

  • ただいまの回答率 87.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る