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

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

新規登録して質問してみよう
ただいま回答率
85.39%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

YouTube

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

YouTube API

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

Q&A

0回答

1267閲覧

GASでYouTubeのチャンネル登録者数を取得したい。

kykyky

総合スコア0

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

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

YouTube

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

YouTube API

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

0グッド

2クリップ

投稿2023/04/09 02:08

実現したいこと

特定のスプレッドシートシートにYouTubeのチャンネルURLを入力しておいて、その下にチャンネル名、チャンネル登録者数、記録した日付を自動入力したい。

前提

Google apps scriptで、YouTubeアカウントの登録者数を定期的に取得したく、調べて見つけたコードを使ったのですが、エラーが出てしまいました。

発生している問題・エラーメッセージ

"TypeError: Cannot read properties of undefined (reading '0') getSubscriberCount @ コード.gs:31

該当のソースコード

GAS

1"function getSubscriberCount() { 2 3 //APIキー 4 var key = ""APIキー""; 5 //反映させるシート 月ごとにシートを変えたい場合などに変更してください 6 var sheetName = ""シート1"" 7 8 var ss = SpreadsheetApp.getActiveSpreadsheet() 9 var srcSheet = ss.getSheetByName(sheetName); 10 11 var rowTitle = 1; 12 var rowURL = 2; 13 var rowEnd = srcSheet.getDataRange().getLastRow(); 14 var rowToday = rowEnd + 1; 15 var colDate = 1; 16 var colStart = 2; 17 var colEnd = srcSheet.getDataRange().getLastColumn(); 18 19 var formatDate = Utilities.formatDate(new Date(),""JST"",""yy/MM/dd""); 20 srcSheet.getRange(rowToday,1).setValue(formatDate); 21 22 for (i=colStart; i<=colEnd; i++) { 23 24 25 var channelURL = srcSheet.getRange(rowURL,i).getValue(); 26 var channelID = channelURL.slice(32); 27 28 //登録者数を取得 29 var dataURL = ""https://www.googleapis.com/youtube/v3/channels?part=statistics&id="" + channelID +""&key="" + key; 30 var response = UrlFetchApp.fetch(dataURL) 31 var subscribe = JSON.parse(response.getContentText()).items[0].statistics.subscriberCount; 32 33 //チャンネルタイトルを取得 34 var dataURL = ""https://www.googleapis.com/youtube/v3/channels?part=snippet&id="" + channelID +""&key="" + key ; 35 var response = UrlFetchApp.fetch(dataURL) 36 var channnelTitle = JSON.parse(response.getContentText()).items[0].snippet.title; 37 38 39 //登録者数をシートに挿入 40 srcSheet.getRange(rowToday,i).setValue(subscribe); 41 42 //チャンネルタイトルをシートに挿入 43 srcSheet.getRange(rowTitle,i).setValue(channnelTitle);  44 } 45 46}; 47 48function onOpen() { 49 var sheet = SpreadsheetApp.getActiveSpreadsheet(); 50 var entries = [ 51 { 52 name : ""Youtubeチャンネル登録者数取得"", 53 functionName : ""getSubscriberCount"" 54 } 55 ]; 56 sheet.addMenu(""スクリプト実行"", entries); 57};"

試したこと

同じコードについて、teratailで質問されている記事を見つけ、そこに書かれていた内容は確認しました。

https://www.youtube.com/channel/UC******* の形式になっていることを確認しました。

その記事に書かれていた、コードも試してみましたが、エラーが出ました。

試したコード

GAS

1function getSubscriberCount() { 2 //APIキー 3 var key = "自分のAPIキー; 4 //反映させるシート 5 var sheetName = "シート1" 6 var authorUrl = "https://teratail.com/questions/aucio02i665ci9" 7 var ss = SpreadsheetApp.getActiveSpreadsheet() 8 var srcSheet = ss.getSheetByName(sheetName); 9 10 var rowTitle = 1; 11 var rowURL = 2; 12 var rowEnd = srcSheet.getDataRange().getLastRow(); 13 var rowToday = rowEnd + 1; 14 var colDate = 1; 15 var colStart = 2; 16 var colEnd = srcSheet.getDataRange().getLastColumn(); 17 18 var formatDate = Utilities.formatDate(new Date(), "JST", "yy/MM/dd"); 19 srcSheet.getRange(rowToday, 1).setValue(formatDate); 20 21 for (var i = colStart; i <= colEnd; i++) { 22 23 var channelURL = srcSheet.getRange(rowURL, i).getValue(); 24 var channelID = channelURL.slice(32); 25 26 var dataURL = "https://www.googleapis.com/youtube/v3/channels?part=statistics,snippet&id=" + channelID + "&key=" + key; 27 var response = UrlFetchApp.fetch(dataURL, options); 28 var res = JSON.parse(response.getContentText()); 29 if (res.pageInfo.totalResults === 0) { 30 // 結果数がゼロの場合、スキップ 31 console.log('URL:「' + channelURL + '」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。'); 32 continue; 33 } 34 //登録者数を取得 35 var subscribe = res.items[0].statistics.subscriberCount; 36 37 //チャンネルタイトルを取得 38 var channnelTitle = res.items[0].snippet.title; 39 40 //登録者数をシートに挿入 41 srcSheet.getRange(rowToday, i).setValue(subscribe); 42 43 //チャンネルタイトルをシートに挿入 44 srcSheet.getRange(rowTitle, i).setValue(channnelTitle); 45 } 46 console.log('処理を完了しました。'); 47}; 48 49function onOpen() { 50 var sheet = SpreadsheetApp.getActiveSpreadsheet(); 51 var entries = [ 52 { 53 name: "Youtubeチャンネル登録者数取得", 54 functionName: "getSubscriberCount" 55 } 56 ]; 57 sheet.addMenu("スクリプト実行", entries); 58};

エラーメッセージ

ReferenceError: options is not defined getSubscriberCount @ コード.gs:27

補足情報(FW/ツールのバージョンなど)

コードを入力して、トリガーで、毎日、23時から24時に実行されるようにっ設定しています。
最初の一週間ほどは、スプレッドシートにデータが入力されていましたが、最近、上記のようなエラーとなっていました。
どのように修正したら良いのか、わからないので、詳しく、コード等を編集していただけると幸いです。

参考記事

https://note.com/nakashio_note/n/n28c1979224a1
この記事を参考にしました。

参考にした質問

https://teratail.com/questions/aucio02i665ci9

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2023/04/09 02:21

「試したコード」の27行目を var response = UrlFetchApp.fetch(dataURL); に修正してみては?
kykyky

2023/04/09 04:13 編集

修正してみましたが、修正したら、以下のようなログが表示され、更新されませんでした。 ---------------------------------------------------------------------------------------------------------------------------------------- 13:05:32 お知らせ 実行開始 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「日付」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「登録者数」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「日付」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「登録者数」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 URL:「」の結果はゼロでした。存在しないチャンネルIDか、URLの形式が正しくない可能性があります。処理をスキップします。 13:05:34 情報 処理を完了しました。 13:05:34 お知らせ 実行完了 ---------------------------------------------------------------------------------------------------------------------------------------- 補足ですが、スプレッドシートのB2とC2にURLを入力しています。 B2~B9, C2~C9には3月25日から3月31日に取得したデータが入力されています。
退会済みユーザー

退会済みユーザー

2023/04/09 04:30

ちゃんと、「正しいチャンネルID」がプログラムに渡されていることは確認しました? ・正しいチャンネルIDってのは、UCから始まる24文字なんですけど、 コードだとslice(32)になってるんで、URLがきっちり 「https://www.youtube.com/channel/UC+22文字」 という文字列になってないと、余計な文字列が渡されて存在しないIDで検索されちゃいますよ。 つまりは 前半が「https://www.youtube.com/channel/」っていう32文字 & 後半が「UCで始まる24文字」 というURLでなければだめ。 (「https://www.youtube.com/channel/UC+22文字?watch~なんたら」 とか後ろに変な文字がくっついてると存在しないチャンネルIDが渡されちゃう) →上に書いたのがあってても同じエラーが出るならそもそもそのチャンネルurlが無効ってことだと思う。
kykyky

2023/04/09 06:43

URLも、確認しました。URLのUCの後の22文字の後には、何も、書かれていません。 >ちゃんと、「正しいチャンネルID」がプログラムに渡されていることは確認しました? どうやって確認すれば良いのか良いのか教えていただきたいです。
YellowGreen

2023/04/10 19:57 編集

該当のソースコードで、引用符 " が必ず2つ並んでいるのは何故なのでしょうか? 参考にされたコードは、引用符は1つですので、全置換で敢えてそのようにしたのでしょうか。 それから、関数全体も引用符で囲まれていますが、ソースコードをアップしたときに何か操作したのでしょうか。 念のためですが、APIのコンソールは確認されましたか。クォータ上限などで制限されていたりはしませんでしょうか。
YellowGreen

2023/04/10 22:46 編集

該当のソースコードに有効なAPIキーを設定して、 二重引用符と関数の前後の引用符を修正した上で実行したところ、 今日の日付とチャンネル登録者数、チャンネルタイトルが適切に シートに記入されました。 ソースコードは問題ないと思われますので Google Cloud のコンソールでYoutube Data API v3のステータスなど コード以外の理由を ご確認いただいた方がよろしいのではないでしょうか。 3月31日までデータ取得ができていて 4月1日からできなくなったということなら、 月が変わったことでチャンネルに関係する何かが変更されていたり 何かの期限が切れたりなど考えられませんでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.39%

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

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

質問する

関連した質問