teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

Q&A

解決済

2回答

160閲覧

Google App Scriptのエラー400の解決方法がわかりません

mineksksks

総合スコア3

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

YouTube

YouTubeとはユーザーがビデオをアップロード・共有・閲覧できるビデオ共有ウェブサイトです。

YouTube API

YouTube APIはYouTubeのビデオコンテンツと機能性をウェブサイト、アプリケーション、デバイスに統合することを可能にします。

0グッド

2クリップ

投稿2025/06/06 16:42

0

2

実現したいこと

プログラミング初学者です。
youtube apiを利用して、YouTubeの検索ワードから関連動画情報をスプレッドシートに出力したいです。
理解が乏しいため、ネットからコードをコピペして実行してみたのですが、下記のようなエラーが出てしまいました。

発生している問題・分からないこと

以下がエラーメッセージです。

Exception: Request failed for https://www.googleapis.com returned code 400. Truncated server response: {
"error": {
"code": 400,
"message": "Invalid value at 'max_results' (TYPE_UINT32), "youtube"",
"errors": [
{
"messag... (use muteHttpExceptions option to examine full response)
searchAndDisplayVideosInSpreadsheet @ 無題.gs:26

該当のソースコード

GAS

1function searchAndDisplayVideosInSpreadsheet() { 2 var API_KEY = 'YOUR_YOUTUBE_API_KEY'; // Replace with your YouTube API Key 3 var SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; // Replace with your Spreadsheet ID 4 var sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet(); 5 var searchQuery = sheet.getRange("A1").getValue(); 6 var maxResults = sheet.getRange("B1").getValue(); 7 var baseUrl = 'https://www.googleapis.com/youtube/v3/search'; 8 var options = { 9 key: API_KEY, 10 part: 'snippet', 11 q: searchQuery, 12 type: 'video', 13 maxResults: maxResults, 14 order: 'relevance', 15 }; 16 var query = '?key=' + options.key + 17 '&part=' + options.part + 18 '&q=' + options.q + 19 '&type=' + options.type + 20 '&maxResults=' + options.maxResults + 21 '&order=' + options.order; 22 var response = UrlFetchApp.fetch(baseUrl + query); 23 var data = JSON.parse(response.getContentText()); 24 if (data.items.length > 0) { 25 data.items.forEach(function(item, index) { 26 var videoId = item.id.videoId; 27 var videoResponse = UrlFetchApp.fetch('https://www.googleapis.com/youtube/v3/videos?key=' + API_KEY + '&id=' + videoId + '&part=statistics,snippet'); 28 var videoData = JSON.parse(videoResponse.getContentText()); 29 var title = item.snippet.title; 30 var channelTitle = item.snippet.channelTitle; 31 var description = item.snippet.description; // Overview of the video 32 var viewCount = videoData.items[0].statistics.viewCount; 33 var likeCount = videoData.items[0].statistics.likeCount; 34 var commentCount = videoData.items[0].statistics.commentCount; 35 var videoUrl = 'https://www.youtube.com/watch?v=' + videoId; 36 sheet.getRange(index + 4, 1).setValue(title); 37 sheet.getRange(index + 4, 2).setValue(channelTitle); 38 sheet.getRange(index + 4, 3).setValue(description); 39 sheet.getRange(index + 4, 4).setValue(viewCount); 40 sheet.getRange(index + 4, 5).setValue(likeCount); 41 sheet.getRange(index + 4, 6).setValue(commentCount); 42 sheet.getRange(index + 4, 7).setValue(videoUrl); 43 }); 44 sheet.getRange(3, 1).setValue("タイトル"); 45 sheet.getRange(3, 2).setValue("チャンネル名"); 46 sheet.getRange(3, 3).setValue("概要"); 47 sheet.getRange(3, 4).setValue("再生回数"); 48 sheet.getRange(3, 5).setValue("いいね数"); 49 sheet.getRange(3, 6).setValue("コメント数"); 50 sheet.getRange(3, 7).setValue("動画URL"); 51 } else { 52 Logger.log('No videos found.'); 53 } 54}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

エラー文をコピペしたりして色々調べてみましたが、よくわかりませんでした。
また、他にもyoutube apiを使って、取得したyoutubeの動画のIDから再生数を表示するプログラムも作ったのですが、そちらは問題なく動きました。

補足

ソースコードの2行目の 'YOUR_YOUTUBE_API_KEY' と3行目の 'YOUR_SPREADSHEET_ID' は実際には自分のYoutube API KeyとスプレッドシートのIDに差し替えてますが、ここではそのままにしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2025/06/06 22:16

maxResultsには何が入っていますか?
mineksksks

2025/06/06 22:23

B1セルのことでしょうか?B1セルには出力する動画の最大数を入力します
YellowGreen

2025/06/06 22:49 編集

スプレッドシートの左端のシートのB1セルに適切な値が入力されていますか var maxResults = sheet.getRange("B1").getValue(); の後に console.log('シート名: ' + sheet.getName()); console.log('B1セル: ' + maxResults); の2行を追加して実行してみてはいかがでしょう?
YellowGreen

2025/06/06 23:21

これまでの質問履歴を拝見しました…
mineksksks

2025/06/07 03:57

既存のスプレッドシートにシートを追加したものに出力したのが原因だったみたいです。 新しいスプレッドシートを作成して実行したらうまく動きました! 回答していただきありがとうございました。
guest

回答2

0

自己解決

既存のスプレッドシートに追加したシートに出力するのではなく、新しいスプレッドシートを作成してから出力する

投稿2025/06/07 04:01

mineksksks

総合スコア3

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

YouTube APIに挑戦中とのことですね

エラーメッセージ Invalid value at 'max_results' (TYPE_UINT32), "youtube" は、「max_results に youtube という文字列が入っていますが、これは正の整数であるべきです」という意味です。

おそらく、スプレッドシートのB1セルに「youtube」などの文字列が入力されているのが原因です。B1セルには取得したい動画の最大件数を数値で入力する必要があります。

スプレッドシートのB1セルに数値(例えば 10)を入力してみてください。もしB1セルに検索キーワードを入れたい場合は、後述の「B1セルを検索キーワードに使う場合」を参考にしてスクリプトを修正ください。

JavaScript

1function searchAndDisplayVideosInSpreadsheet() { 2 const API_KEY = 'YOUR_YOUTUBE_API_KEY'; // APIキーを設定 3 const SPREADSHEET_ID = 'YOUR_SPREADSHEET_ID'; // スプレッドシートIDを設定 4 const sheet = SpreadsheetApp.openById(SPREADSHEET_ID).getActiveSheet(); 5 const searchQuery = sheet.getRange("A1").getValue(); 6 const maxResults = parseInt(sheet.getRange("B1").getValue(), 10) || 10; // B1セルの値を数値に変換し、数値でない場合は10をデフォルト値とする 7 8 const url = `https://www.googleapis.com/youtube/v3/search?key=${API_KEY}&part=snippet&q=${searchQuery}&type=video&maxResults=${maxResults}&order=relevance`; 9 10 try { 11 const response = UrlFetchApp.fetch(url); 12 const data = JSON.parse(response.getContentText()); 13 14 // ヘッダー行の出力 (データ取得前に出力) 15 sheet.getRange(3, 1, 1, 7).setValues([["タイトル", "チャンネル名", "概要", "再生回数", "いいね数", "コメント数", "動画URL"]]); 16 17 18 if (data.items && data.items.length > 0) { // itemsの存在チェック 19 data.items.forEach((item, index) => { 20 // ... (動画情報の処理は現状のコードをそのまま使用) 21 }); 22 } else { 23 // エラー処理:動画が見つからない場合の処理 24 sheet.getRange(3, 1).setValue("動画が見つかりませんでした。"); 25 } 26 27 } catch (error) { 28 // エラー処理:APIリクエストエラーなどの処理 29 Logger.log(`エラーが発生しました: ${error}`); 30 sheet.getRange(3, 1).setValue("エラーが発生しました。ログを確認してください。"); 31 } 32}

parseInt で数値に変換: parseInt(sheet.getRange("B1").getValue(), 10) を使って、B1セルの値を明示的に整数に変換しています。 || 10 を追加することで、B1セルが空欄や数値以外の値の場合でもデフォルト値として10が使用されます。これは予期せぬエラーを防ぐための重要なポイントです。
デフォルト値の設定: maxResults にデフォルト値を設定することで、B1セルが空欄の場合でもエラーを防ぎます。
エラー処理の追加: try...catch構文を使ってエラー処理を追加しました。APIリクエストが失敗した場合や、予期せぬエラーが発生した場合でも、スクリプトが停止するのを防ぎ、エラーメッセージを表示することができます。

B1セルを検索キーワードとして使用したい場合

JavaScript

1// ... (他のコードは同じ) 2const searchQuery = sheet.getRange("A1").getValue(); // 検索キーワードはA1セルから取得 3const maxResults = 10; // 最大取得件数は直接指定 (または別のセルから取得) 4 5const url = `https://www.googleapis.com/youtube/v3/search?key=${API_KEY}&part=snippet&q=${searchQuery}&type=video&maxResults=${maxResults}&order=relevance`; 6// ... (残りのコードは同じ)

GAS のデバッグ機能(スクリプトエディタの虫マーク)を使うと、変数の値を確認しながらコードの状況を把握できます。

投稿2025/06/07 03:45

sucman

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mineksksks

2025/06/07 03:57

既存のスプレッドシートにシートを追加したものに出力したのが原因だったみたいです。 新しいスプレッドシートを作成して実行したらうまく動きました! 丁寧に回答していただきありがとうございました。
YellowGreen

2025/06/07 04:04 編集

スプレッドシートをopenByIdで開いているので、 一番左端以外のシートをブラウザで開いていたとしても getActiveSheetで取得されるのは一番左端にあるシートになります 目的のシートが左端にないのでB1の値が違うシートの値になっていたことが原因です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問