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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1129閲覧

GAS YoutubeDetaApiで動画IDの取得時にエラー発生

anninsan

総合スコア14

YouTube API

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/20 04:09

編集2021/09/20 04:25

前提

GasでYoutubeDetaApi v3を使用しています。
YoutubeApiを使って再生リスト内の動画IDを取得するプログラムを作っています

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

forで繰り返し取得してるのですが6回目の取得でこのようなエラーが発生しました。

javascript

1TypeError: Cannot read property 'contentDetails' of undefined

該当のソースコード

javascript

1//再生リスト内の動画数取得 2var maxitem = YouTube.Playlists.list("contentDetails" , {id : "PLfSyOyZy1R_GnOcLlgV85lyeVNf1IyM7N"}).items[0].contentDetails.itemCount; 3console.log("再生リストの動画数は"+maxitem+"です。"); 4for(let itemcount = 0; maxitem>itemcount; itemcount++) 5{ 6 //再生リスト内の動画IDをforですべて取得 7 var listitem = YouTube.PlaylistItems.list("contentDetails", {playlistId : "PLfSyOyZy1R_GnOcLlgV85lyeVNf1IyM7N"}).items[itemcount].contentDetails.videoId; 8 console.log("動画IDは"+listitem+"です") 9} 10

聞きたい事

・このエラーはどのようなエラーなのでしょうか。
・そして解決方法を教えて下さい。

###p.s.
再生リストにある動画数は6です

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

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

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

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

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

guest

回答1

0

ベストアンサー

・このエラーはどのようなエラーなのでしょうか。

意訳すると 「undefinedの変数に対して'contentDetails' というプロパティを読み取ろうとしたので
エラー」、ということになります。

ここで undefined になっているのは、7行目の
YouTube.PlaylistItems.list(~~).items[itemcount]
です。

この場合考えられるのは、items の要素数を超えて配列にアクセスしようとしたということです。

6回目の取得でこのようなエラーが発生したとのことなので、
YouTube.PlaylistItems.list(~~).items は
インデックス0~4 の5個までは存在していて、5(=6番目)が存在せず
YouTube.PlaylistItems.list(~~).items[5] が undefined
になっているのでしょう。


・そして解決方法を教えて下さい。

Youtube APIのドキュメントによると、PlaylistsItem.listは、maxResultsを指定しなかった場合、最大5つまでしかアイテムを返しません。(「デフォルト値は5」)

イメージ説明
(引用元:PlaylistItems.list | YouTube Data API

したがって、下記のように、list関数のオプション引数に maxResultsの数を指定します。(下記では指定できる最大値50を設定。見やすいように改行しています)

【修正前】 //再生リスト内の動画IDをforですべて取得 var listitem = YouTube.PlaylistItems.list("contentDetails",   {playlistId : "PLfSyOyZy1R_GnOcLlgV85lyeVNf1IyM7N"})   .items[itemcount].contentDetails.videoId; ↓ 【修正後】 var listitem = YouTube.PlaylistItems.list("contentDetails",   {playlistId : "PLfSyOyZy1R_GnOcLlgV85lyeVNf1IyM7N", maxResults: 50})   .items[itemcount].contentDetails.videoId;

<その他>
実は、プレイリストIDが分かっているのであれば、そのプレイリストに含まれるアイテム数や動画ID等を取得するときにYouTube.Playlists.list を使う必要はありません。

YouTube.Playlists.list は通常、指定したチャンネル内に存在するプレイリストの情報を抽出するために使用します。

指定したプレイリストIDに含まれる動画のリストは、YouTube.Playlists.listを使わずともYouTube.PlaylistItems.list だけで取得できます。

(アイテム数は、取得したデータの .pageInfo.totalResults で取得できます)

また、質問元のコードでは、ループごとに(プレイリスト内のアイテム1個ごとに) YouTube.PlaylistItems.list を呼び出していますが、これは毎回同じものを呼び出していることになるので、ループ前に1回呼び出せば十分です。

ただし、プレイリスト内に50個を超えるアイテムが含まれている場合、前述のように1回あたり最大50個までしか取得できません。
50個を超えるアイテムを取得する場合は、nextPageTokenパラメータを使用してページを切り替えながら取得する必要があります。

まとめると、任意のプレイリストID内の動画IDを表示するスクリプトは下記のようになります。

js

1var PLAYLISTID = 'PLfSyOyZy1R_GnOcLlgV85lyeVNf1IyM7N' 2 3function myFunction() { 4 var listitems = null; 5 var pageToken = null; 6 7 //再生リスト内の動画IDをすべて取得 8 while (true) { 9 listitems = YouTube.PlaylistItems.list("contentDetails", 10 {playlistId : PLAYLISTID, maxResults:50, pageToken:pageToken}); 11 12 var items = listitems.items; 13 14 for(var i = 0; i < items.length; i++) { 15 console.log("動画IDは"+items[i].contentDetails.videoId+"です"); 16 } 17 // 次のページのpageTokenを取得 18 pageToken = listitems.nextPageToken; 19 20 // ページが終わりならばwhileを抜ける 21 if (pageToken == null) break; 22 } 23}

投稿2021/09/20 06:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

anninsan

2021/09/21 02:43

ありがとうございます! 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問