【JavaScript】YouTubeのドラフトを一括公開するコード(2025年3月)
『ユウゴウパズル』の攻略動画を70本以上 Youtubeにアップしたんですが、「いちいち公開ボタン押すのテソい!(鹿児島弁でめんどくさい)」と思って検索したところ、コードで解決できるという記事が。
それを元に、ChatGPT の手も借りつつ自分の設定に変えたり、追記をしてみました。

概要
YouTubeスタジオのドラフト(下書き)を、一括で公開にします。
- JavaScript
- Google Chrome (F12キーを使う)
- 2025/03/12 自分で使って確認
こちらを参考に、いじったものになります:
YouTube Studioのドラフト編集を楽にしたい - Qiita
私の設定
視聴者:子供向けではない
子供向け/子供向けではない、どちらかを先に設定しないと、公開設定のページに進めない。
公開
非公開/限定公開ではありません。
やり方

⑤ 下のコードをコピペ
「 > 」部分にテキスト入力できるので、下のコードをコピぺ。
⚡ペーストできない
こんな警告が出て、ペーストできない時:
Warning: Don’t paste code into the DevTools Console that you don’t understand or haven’t reviewed yourself. This could allow attackers to steal your identity or take control of your computer. Please type ‘allow pasting’ below to allow pasting.
「 理解してないコードを貼り付けないでね。悪い奴が情報盗んだり操作したりするからね。貼り付けたいなら、allow pasting と打ってね 」
ということなので、ペースト可能にするには allow pasting と手打ちすればOK。むやみやたらにコピペするのは、リスクがあるからねーという注意書きです。
editDraft = async () => {
return new Promise ((resolve) => {
document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions").click();
setTimeout(() => resolve(), 3000);
});
};
activateNotChild = async () => { // 視聴者:子供向けではない
return new Promise ((resolve) => {
document.querySelector("#audience > ytkc-made-for-kids-select > div.made-for-kids-rating-container.style-scope.ytkc-made-for-kids-select > tp-yt-paper-radio-group > tp-yt-paper-radio-button:nth-child(2)").click();
setTimeout(() => resolve(), 3000);
});
};
activateLastStep = async () => { // 公開設定へ
return new Promise ((resolve) => {
document.querySelector("#step-title-3").click();
setTimeout(() => resolve(), 3000);
});
};
activatePublic = async () => {
return new Promise ((resolve) => {
setTimeout(() => {
let publicButton = document.querySelector('tp-yt-paper-radio-button[name="PUBLIC"]');
if (publicButton) {
publicButton.click();
console.log("✅ 公開ボタンをクリックしました!");
resolve();
} else {
console.error("❌ 公開ボタンが見つかりません!");
}
}, 3000); // 3秒待機
});
};
doneEdit = async () => {
return new Promise ((resolve) => {
document.getElementById('done-button').click();
setTimeout(() => resolve(), 5000);
});
};
closeDialog = async () => {
return new Promise ((resolve) => {
document.querySelector('#close-button button').click();
setTimeout(() => resolve(), 5000);
});
};
publish = async () => {
await editDraft();
await activateNotChild();
await activateLastStep();
await activatePublic();
await doneEdit();
await closeDialog();
};
publishCurrentPageContent = async () => {
for (i=0; i<50; i++) {
if (!document.querySelector("#row-container > div:nth-child(8) > ytcp-video-list-cell-actions > div > ytcp-button.edit-draft-button.style-scope.ytcp-video-list-cell-actions")) {
break;
}
await publish();
}
};
⑥ 下のコマンドをコピペ
上の長~いコードをコピペしたら、改行。最後に下のコマンドをコピペ。
ENTERキーで自動公開スタート!
ページを閉じずに、終わるまで待とう。途中でやめたい時は、タブを閉じるか更新。
publishCurrentPageContent();
小話
ChatGPT に手伝ってもらいながら作りました。楽しかったー。




click();
で閉じる?aria-disabled='false'?

#close-button
はある、false

'#close-button button'

await closeDialog();
が無いや

ベースは
「Youtube の ページの中から目当てのボタンタグを探して、
なので、仕様が大きく変わらない限りは、ページの HTML/CSS を調べて応用できそう。
例:「視聴者:子供向け」にしたい。
10行目の
tp-yt-paper-radio-button:nth-child(2)
(1)
でいいと思う。もしくは、YouTubeスタジオのチェックボックスで動画を一括選択視聴者を先に指定。で、関連コードをまるごと消す:
8 - 13行目の
activateNotChild = async () => {
から始まる部分。53行目の
await activateNotChild();
「 公開ボタンをクリックしました! 」
のログもカットできるけど、せっかく ChatGPT が作ってくれたし、かわいいので残しました。ボタン押したタイミングもわかりやすくて良し。