LoginSignup
4
4

More than 5 years have passed since last update.

GASでYouTubeの自分の再生リストを全て非公開にする。

Posted at

前置き

今まで、YouTubeの動画をお気に入りに登録するのと同じように、再生リストにまとめてきたのですが、
非公開のつもりでまとめていたら、どうやら公開されているということに気が付きました。
で、泣く泣く手動で再生リストを非公開化しようと思ったら、「数が膨大でやってられない!」
ということで、ふと、GASにYouTubeのAPIが追加されたのを思い出して、全て非公開にするスクリプトを
作って動かしてみました。

本日のコード

コード.gs
function myFunction() {
  var nextToken = "";
  while(nextToken != null) {
    var res = YouTube.Playlists.list('snippet,status', 
                                     {maxResults: 50,
                                      mine: true,
                                      pageToken: nextToken});

    for(var i = 0; i < res.items.length; i++) {
      var item = res.items[i];

      // PlaylistResponse.itemsの型はPlaylist
      if(item.status.privacyStatus != "private") {
        Logger.log("update: " + item.snippet.title + ", " + item.status.privacyStatus );
        item.status.privacyStatus = "private";
        var updateRes = YouTube.Playlists.update(item, "snippet, status");
        Logger.log(updateRes.status.privacyStatus);
      }

    }

    nextToken = res.nextPageToken;
  }
}

YouTube Data APIの有効化と承認が必要です。

GASからYouTubeのAPIを実行するためにAPIを有効にします。
gas側の有効化.png

同時に、Developer ConsoleでもAPIを有効にしておきます。
api有効化.png

実行時に、読み取りと、書き込みの承認をします。YouTube.Playlists.list()YouTube.Playlists.update()を別々に試したので2つに分かれていますが、いきなり更新まで試す場合は、1回で済むと思います。
読み取りの承認.png
書き込み承認.png

解説

まず、自分の再生リストを取得するには、YouTube.Playlists.list()を使います。第1引数が難しいですが、"snippet"を指定すると、再生リストのデータが取得されますが、公開/非公開などのstatus情報は付加されません。(GASでは、undefined)
従って、第1引数は、カンマ区切りで、"snippet,status"と指定しています。ただし、"status"だけでは、エラーになります。

YouTube.Playlists.list()は、最大50件まで、デフォルト5件なので、それ以上登録している場合は、pageTokenパラメータにYouTube.Playlists.list()で取得したnextPageTokenを指定します。最後まで取得し終わったらnextPageTokenがnullになりますので、while文で繰り返し取得します。
(私は、タイプミスがあって、無限ループしていると思い込んでいたけど、実は違ってた…)

戻り値に再生リストレスポンスが返されるので、それをそのまま利用します。
res.items[i]が再生リストの情報です。

公開/非公開情報は、res.items[i].status.privacyStatusに入っていて、"private"、"public"、"unlisted"の3のうちどれかが格納されています。ので、"private"でなければ、"private"に上書きして、YouTube.Playlists.update()を呼び出します。
引数が2つのものと、3つのものがありますが、今回のケースでは、2つの方を使えば大丈夫です。

結果

無事、全て非公開になりました!
が、もう少しGAS側で吸収できないのかな…。statusを付けずに読み取るなんていうことがありえるんだろうか…?まあ、いらないものは送らない方が速度面で有利だとは思うけど、パラメータの指定方法はわかりにくい…。

参考

https://developers.google.com/apps-script/advanced/youtube
https://developers.google.com/youtube/v3/docs/playlists

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4