NotebookLM × YouTube再生リスト|URL一括抽出をGASで自動化してリサーチ効率を最大化する
この記事で解決すること
- NotebookLMが直接対応していない「YouTube再生リストURL」からの全動画読み込みを可能にします。
- YouTube Data APIの50件制限を自動で突破し、大量の動画(100本以上も可)を一括抽出します。
- 削除済み・非公開動画を自動除外。有効なURLだけをNotebookLMに渡せます。
はじめに
AIリサーチツールとして強力な NotebookLM ですが、YouTube動画をソースにする際、以下の不便さを感じたことはありませんか?
- 再生リストURLを貼っても、リスト内の全動画を読み込んでくれない
- 動画が大量にある場合、1つずつURLをコピーするのが苦行
- 削除済み動画が混ざっていると、追加時にエラーが出て止まってしまう
そこで、Google Apps Script(GAS)を使って、再生リストから「現在公開されている動画URL」だけをトピック別に自動抽出し、スプレッドシートで一括管理・活用するシステムを作成しました。
システム構成図
スプレッドシートを起点に、GASがYouTube APIを経由してデータを取得し、NotebookLMへ渡すためのURLリストを生成する流れです。
前提条件
本システムを利用するには、以下の準備が必要です。
- Googleアカウント: スプレッドシートとGASを使用します。
- YouTube Data API v3 の有効化(重要):
実装手順
1. スプレッドシートの準備
- 新規スプレッドシートを作成し、シート名を
設定に変更します。 - 1行目に以下の見出しを入力します。
| トピック名 | 再生リストURL | 最終更新 | 件数 |
|---|---|---|---|
| (例) AI最新動向 | https://www.youtube.com/playlist?list=... |
(自動入力) | (自動入力) |
2. GASの実装
/**
* スプレッドシートを開いた時に、メニューバーに「★YouTube連携」メニューを追加
*/
function onOpen() {
const ui = SpreadsheetApp.getUi();
ui.createMenu('★YouTube連携')
.addItem('URLリストを一括更新する', 'extractAllPlaylists')
.addToUi();
}
/**
* 「設定」シートから全再生リストを読み込み、URLを各シートに書き出し
*/
function extractAllPlaylists() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const configSheet = ss.getSheetByName('設定');
if (!configSheet) {
SpreadsheetApp.getUi().alert('「設定」という名前のシートが見つかりません。');
return;
}
const data = configSheet.getDataRange().getValues();
for (let i = 1; i < data.length; i++) {
const topicName = data[i][0];
const playlistUrl = data[i][1];
if (!topicName || !playlistUrl) continue;
const playlistId = playlistUrl.includes('list=')
? playlistUrl.split('list=')[1].split('&')[0]
: playlistUrl;
try {
const validUrls = fetchValidUrls(playlistId);
let targetSheet = ss.getSheetByName(topicName);
if (!targetSheet) {
targetSheet = ss.insertSheet(topicName);
}
targetSheet.clear();
if (validUrls.length > 0) {
targetSheet.getRange(1, 1).setValue("NotebookLM用URL(この列をコピー)").setFontWeight('bold');
const outputData = validUrls.map(url => [url]);
targetSheet.getRange(2, 1, outputData.length, 1).setValues(outputData);
configSheet.getRange(i + 1, 3).setValue(new Date());
configSheet.getRange(i + 1, 4).setValue(validUrls.length + "件");
}
} catch (e) {
configSheet.getRange(i + 1, 3).setValue("エラー: " + e.message);
}
}
SpreadsheetApp.getUi().alert('全てのリストの更新が完了しました!');
}
/**
* YouTube APIを使用して有効な動画URLを全件取得
*/
function fetchValidUrls(playlistId) {
let videoIds = [];
let nextPageToken = '';
while (nextPageToken !== undefined) {
const res = YouTube.PlaylistItems.list('contentDetails', {
playlistId: playlistId,
maxResults: 50,
pageToken: nextPageToken
});
if (!res.items || res.items.length === 0) break;
res.items.forEach(item => videoIds.push(item.contentDetails.videoId));
nextPageToken = res.nextPageToken;
}
let validUrls = [];
for (let i = 0; i < videoIds.length; i += 50) {
const chunk = videoIds.slice(i, i + 50);
const vRes = YouTube.Videos.list('status', { id: chunk.join(',') });
vRes.items.forEach(v => {
const privacy = v.status.privacyStatus;
if (privacy === 'public' || privacy === 'unlisted') {
validUrls.push(`https://www.youtube.com/watch?v=${v.id}`);
}
});
}
return validUrls;
}
使い方
- スプレッドシートをリロードすると、メニューに 「★YouTube連携」 が表示されます。
- 「URLリストを一括更新する」を実行(初回は承認が必要)。
- トピック別シートに生成されたURLをコピーし、NotebookLMに貼り付ければ完了です!
おわりに
NotebookLMでのソース管理が劇的に楽になります。ぜひ活用してください!

