YouTubeAPIで400エラーの解決方法(スプレッドシート) Exception: Request failed for https://youtube.googleapis.com returned code 400.

業務効率化
スポンサーリンク

過去記事で「YouTube動画の再生数をスプレッドシートで取得する」というものを紹介しましたが、その中でスクリプト実行行うとエラーが出た方もいたのではないでしょうか。

実行ログ上のエラー

AppsScriptの実行ログは上部の『実行』をクリックした後にページ下部に表示されるものです。

AppsScriptに下記のようなエラーが出てませんか?

エラー	 Exception: Request failed for https://youtube.googleapis.com returned code 400. Truncated server response: {
  "error": {
    "code": 400,
    "message": "The request specifies an invalid filter parameter.",
    "errors": [
      {
        "message": "Th... (use muteHttpExceptions option to examine full response)
getMovieViews	@ コード.gs:19

“message”: “The request specifies an invalid filter parameter.”の場合

4行目の”message”に注目です。『The request specifies an invalid filter parameter.』を

  • APIのコピペが失敗している可能性、API使用停止になっている、権限がないなど。
  • APIを取得するURLが間違っている
  • リクエストするパラメータが多すぎる

まずはAPIが間違いなくコピペできているかをご確認ください。
また、リクエストするパラメータ数が多すぎるとエラーが起こります。

YouTubeAPIでリクエストできるのは50件まで

例えば、下記のスクショのような表からE列のIDを取得し、F列に再生数を書き込む場合。
E列のIDが50個以上あると、YouTubeAPIで「たくさんの情報ください!」というリクエストになってしまいます。
そうなるとAPIは「サーバ不可になるから無理です」とエラーを返します。

APIリクエストを50件ごとになるように修正する

先に書いたように50件以上の値の取得をリクエストするとエラーとなってしまうので、50件以上のリクエストを行いたい場合は50件ごとに分割してリクエストするように修正します。

過去記事「YouTube動画の再生数をスプレッドシートで取得する」でも書いたように、YouTubeのリアルタイム再生回数をスプレッドシートに自動で反映させる方法(Qiita)をベースに下記のように修正しました。

  • 1行目のfunction getMovieViews() {…}の『getMovieViews』はスクリプトの名称になるのでわかりやすい名称にしてください
  • 5行目のgetSheetByName(‘DB’);の『DB』はシート名です。対象のシート名を入力してください。
  • 9行目の代入する数字を読み取り列の数字に修正してください。今回はE列からIDを取得するので『5』とします。
  • 11行目の代入する数字を読み取り列の数字に修正してください。今回はF列からIDを取得するので『6』とします。
  • 45行目の『先ほど取得したAPIキー』にあなたの取得したAPIキーに差し替えてください。
function getMovieViews() {

//sheetオブジェクト作成
var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
var sheet = spreadsheet.getSheetByName('DB');


// 読み取る列番号(Aなら1,Eなら5)
var get_col = 5
// 書き込む列番号(Aなら1,Eなら5)
var input_col = 6

//入力されている行数を取得
  for (var finish_row = 2; finish_row < 5000; finish_row++){
    if(sheet.getRange(finish_row,get_col).isBlank()){
      break
    } 
  }

//ループする回数を取得
  var loop = (finish_row - 1 ) / 50;
  var loop_chk = (finish_row - 1 ) % 50;
//割り切れていない場合はループ回数に1を加算
  if (loop_chk != 0){
    var loop = Math.floor(loop) + 1;
  }

//ループ回数分、再生回数取得とシート入力する。
 var start_row = 2; //見出しがあったら2、なければ1
 for (var i = 1; i <= loop; i++){
    
    //動画IDが記入されたセルのrangeオブジェクトを作成
    if(i < loop){
      var range_id=sheet.getRange(start_row,get_col,50)
    }else{
      var range_id=sheet.getRange(start_row,get_col,finish_row - start_row)
    }

    //作成したrangeオブジェクトから動画IDを配列で作成する
    var values=[]; 
    var values=range_id.getValues();
    
    //YouTube APIに送信するクエリを作成する var qury_array=values.map(id =>"&id="+id)
    var qury= qury_array.join("")
    var json_url="https://youtube.googleapis.com/youtube/v3/videos?part=statistics"+qury+"&key=先ほど取得したAPIキー";

    //YouTube APIからデータを受診する
    var json=UrlFetchApp.fetch(json_url).getContentText();
    var jsonData=JSON.parse(json);

    //結果をセルに記入する
    var s = 0;
    for (let row=0; row<values.length; row++){
        Logger.log(jsonData.items[row]['statistics']['viewCount']);
        sheet.getRange(start_row+s,input_col).setValue(jsonData.items[row]['statistics']['viewCount']);
        s = s + 1;
    }

    //範囲を変更
    var start_row = start_row + 50;
  }
}

おわりに

と、いうことで『YouTubeAPIで400エラーの解決方法 Exception: Request failed for https://youtube.googleapis.com returned code 400.』でした。

スプレッドシートには他にもたくさんの便利機能があるので、紹介していきたいと思います。

この記事のスクショ元のスプレッドシート『STGVのカヴァー曲まとめ(スプレッドシート関数サンプル)』、『STGVのカヴァー曲まとめ(スプレッドシート関数サンプル)_再生数定点』で公開してます。
他にもいろいろな関数を使用してますので、参考に見て行ってください。

このスプレッドシートで収集・集計しているのは、私の応援している大分県の仲良しミュージシャンSTGVのメンバーの方がYouTubeチャンネルにアップしているカヴァー曲の情報です。

データを使用して、カヴァー曲のまとめ記事を書いています。
おすすめカヴァーが付いている記事一覧』でまとめています。好きな曲、アーティスト、ジャンルがあったらぜひぜひ聴いていってください。

参考記事

ココで修正してもらいました!

私はココナラでこのスクリプトを修正していただきました。※掲載許可得てます
「コレができるなら、こんなのも?」「ココをもっとこうしたら便利なのに…」と思った、ココナラで相談してみるとよいと思います。

様々なスキルを持った方とのマッチングが可能です。有償にはなってしまいますが、煩わしい作業や自身でできないこと、などお悩みの方はアウトソーシングの検討をおすすめします!

コメント