[GAS] Youtube Data APIを用いて動画のリスト／動画の詳細を取得する方法

はじめまして。

YoutubeDataAPIを用いて特定のYoutubeチャンネルの動画のリストを取得する処理をまとめます。
詰まった内容も下記に記載しておきます。

# 実現したこと
・スプレッドシートにYoutubeのチャンネルの動画を書き込んだこと。
・書き込むために"Google App Script"と"Youtube Data API(v3)"を用いていること。

## 実現結果
チャンネルの動画情報を取得することができます。
<img width="823" alt="スクリーンショット 2020-02-16 0.02.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56169/39de5c8f-a6cd-5a1d-603a-44ac35b1b049.png">


## 利用したツール
・スプレッドシート
・GAS
・Youtube Data API(v3)
※ GASのアドオンは利用せずに実施している。

## ソースコード
ご利用の際は{}内の部分を変更すること。

```
var apiKey = "{API_KEY}";
var sheetName = "{書込み先シート名}"

var channelID = "{チャンネルID}";
var baseUrl = "https://www.googleapis.com/youtube/v3/";

function PlayList() {
  
  var list_nextpageID = undefined;
  do {
    //APIキーの呼び出し
    
    //json形式分解
    var list_resultsPerPage = responseJson.pageInfo.resultsPerPage;
    list_nextpageID = responseJson.nextPageToken;
    
    for(var cnt = 0; cnt < responseJson.items.length; cnt++){
      var videoId = responseJson.items[cnt].id.videoId;
      var title = responseJson.items[cnt].snippet.title;
      var description = responseJson.items[cnt].snippet.description;
      var videoTime = "";
      var type = "List"
      
      if(videoId != undefined){
       type = 'Video' 
       videoTime = getVideoTime(videoId);
      }
      
      
      writeYoutubeVideo(videoId, type, title, description, videoTime);
    }
    
  }while(list_nextpageID != undefined);
}

/**
videoの情報を取得
*/
function getVideoTime(videoId){
  var dataURL = "";
  dataURL = baseUrl + "videos?part=snippet,contentDetails,statistics,status&id=" + videoId + "&key=" + apiKey;
  
  //レスポンス値にjson形式で挿入
  var response = UrlFetchApp.fetch(dataURL);
  var responseJson = JSON.parse(response.getContentText());
  var duration = responseJson.items[0].contentDetails.duration;

  return convertDurationTime(duration);
}

/**
youtubeListを取得
*/
function getYoutubePlayList(channelID, pageToken){
  //APIキーの呼び出し
  var dataURL = "";
  if(pageToken == undefined){
    dataURL = baseUrl + "search?part=snippet&maxResults=50&channelId=" + channelID +"&key=" + apiKey;
  }else {
    dataURL = baseUrl + "search?part=snippet&maxResults=50&channelId=" + channelID +"&key=" + apiKey + "&pageToken=" + pageToken;
  }
  
  //レスポンス値にjson形式で挿入
  var response = UrlFetchApp.fetch(dataURL);
  return JSON.parse(response.getContentText());
}

/**
シートへの書き込み
*/
function writeYoutubeVideo(id, type, title, description, videoTime){
  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var srcSheet = ss.getSheetByName(sheetName);
  
  var rowCnt = srcSheet.getLastRow();
  rowCnt = parseInt(rowCnt + 1);

  srcSheet.getRange(rowCnt, 1).setValue(rowCnt -1);
  srcSheet.getRange(rowCnt, 2).setValue(id);
  if(id != undefined) {
    srcSheet.getRange(rowCnt, 3).setFormula('=HYPERLINK("https://www.youtube.com/watch?v=' + id + '","リンク")')
  }
  
  srcSheet.getRange(rowCnt, 4).setValue(type);
  srcSheet.getRange(rowCnt, 5).setValue(videoTime);
  srcSheet.getRange(rowCnt, 6).setValue(title);
  srcSheet.getRange(rowCnt, 7).setValue(description);
}

/**
durationのコンバート処理
*/
function convertDurationTime(duration) {
  var reg = new RegExp('^PT([0-9]*H)?([0-9]*M)?([0-9]*S)?');
  var regResult = duration.match(reg);
    
  var hour = regResult[1];
  var minutes = regResult[2];
  var sec = regResult[3];
  
  if(hour == undefined) {hour = '00';}
  else {
    hour = hour.split('H')[0];
    if(hour.length == 1){hour = '0' + hour;}
  }

  if(minutes == undefined) {minutes = '00';}
  else {
    minutes = minutes.split('M')[0];
    if(minutes.length == 1){minutes = '0' + minutes;}
  }

  if(sec == undefined) {sec = '00';}
  else {
    sec = sec.split('S')[0];
    if(sec.length == 1){sec = '0' + sec;}
  }
  
  return hour + ":" + minutes + ":" + sec
}
```


# 苦しんだこと
再生時間のコンバートに対応に苦しみました。
APIから取得できる再生時間の値は**"ISO 8601"**形式でありました。
そのため、人が読める状態ではないためコンバート処理を行う必要がありました。
外部ライブラリツールを導入せずに実現したかったため、正規表現とsplitを利用し解決！

再生時間の値の例```
・ISO8601：PT4M21S
・コンバート後の表示：1:23:34(hh:mm:ss)
```


# 実現までにかかった時間
・YoutubeDataAPI取得(15m)
・スプレッドシートの準備(1m)
・スプレッドシートの準備(1m)
・実装(計3h)
　- 動画一覧の取得(1h)
　- 動画詳細の取得(1h)
　- コンバート処理(1h)

# 終わりに
調べていると、このように動画をまとめる記事が少なく驚きました。
最後に、この記事を閲覧してくれた方が実現したいことの参考になれば幸いに思います。