・このエラーはどのようなエラーなのでしょうか。
意訳すると 「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/21 02:43