過去記事で「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チャンネルにアップしているカヴァー曲の情報です。
データを使用して、カヴァー曲のまとめ記事を書いています。
『おすすめカヴァーが付いている記事一覧』でまとめています。好きな曲、アーティスト、ジャンルがあったらぜひぜひ聴いていってください。
参考記事
ココで修正してもらいました!
私はココナラでこのスクリプトを修正していただきました。※掲載許可得てます
「コレができるなら、こんなのも?」「ココをもっとこうしたら便利なのに…」と思った、ココナラで相談してみるとよいと思います。
様々なスキルを持った方とのマッチングが可能です。有償にはなってしまいますが、煩わしい作業や自身でできないこと、などお悩みの方はアウトソーシングの検討をおすすめします!
コメント