/**
* Fetches video, playlist, and subscription counts for the authenticated user's YouTube account.
* This version breaks down the video AND playlist counts by privacy status.
* Logs the results to the Apps Script execution log.
* Note: You can get similar information from the YouTube panel of your Google Account Dashboard
* @see https://myaccount.google.com/dashboard
* Author: Mr Shane
* Version: 2025-08-11
* Prerequisites: Youtube Data API v3
*/
function getMyYouTubeStats() {
const videoCounts = { public: 0, private: 0, unlisted: 0, total: 0 };
const playlistCounts = { public: 0, private: 0, unlisted: 0, total: 0 };
const stats = {
subscriptions: 'N/A',
comments: 'Not available via public API' // This is the correct, final status.
};
try {
const channelResponse = YouTube.Channels.list('contentDetails', { mine: true });
if (channelResponse && channelResponse.items && channelResponse.items.length > 0) {
const uploadsPlaylistId = channelResponse.items[0].contentDetails.relatedPlaylists.uploads;
let pageToken = null;
do {
const playlistItemsResponse = YouTube.PlaylistItems.list('status', {
playlistId: uploadsPlaylistId,
maxResults: 50,
pageToken: pageToken
});
if (playlistItemsResponse.items) {
playlistItemsResponse.items.forEach(item => {
switch (item.status.privacyStatus) {
case 'public': videoCounts.public++; break;
case 'private': videoCounts.private++; break;
case 'unlisted': videoCounts.unlisted++; break;
}
});
}
pageToken = playlistItemsResponse.nextPageToken;
} while (pageToken);
videoCounts.total = videoCounts.public + videoCounts.private + videoCounts.unlisted;
} else {
Logger.log('Could not find a YouTube channel associated with this account.');
return;
}
let playlistPageToken = null;
do {
const playlistsResponse = YouTube.Playlists.list('status', {
mine: true,
maxResults: 50,
pageToken: playlistPageToken
});
if (playlistsResponse.items) {
playlistsResponse.items.forEach(playlist => {
switch (playlist.status.privacyStatus) {
case 'public': playlistCounts.public++; break;
case 'private': playlistCounts.private++; break;
case 'unlisted': playlistCounts.unlisted++; break;
}
});
}
playlistPageToken = playlistsResponse.nextPageToken;
} while (playlistPageToken);
playlistCounts.total = playlistCounts.public + playlistCounts.private + playlistCounts.unlisted;
stats.subscriptions = getTotalCount_(YouTube.Subscriptions, { mine: true, part: 'id' });
Logger.log('--- Your YouTube Stats (Detailed) ---');
Logger.log('Total Videos: ' + videoCounts.total);
Logger.log(' - Public: ' + videoCounts.public);
Logger.log(' - Private: ' + videoCounts.private);
Logger.log(' - Unlisted: ' + videoCounts.unlisted);
Logger.log('-------------------------------------');
Logger.log('Total Playlists: ' + playlistCounts.total);
Logger.log(' - Public: ' + playlistCounts.public);
Logger.log(' - Private: ' + playlistCounts.private);
Logger.log(' - Unlisted: ' + playlistCounts.unlisted);
Logger.log('-------------------------------------');
Logger.log('Total Active Subscriptions: ' + stats.subscriptions);
Logger.log('Total Comments: ' + stats.comments);
Logger.log('-------------------------------------');
} catch (e) {
Logger.log('Error: ' + e.message);
}
}
/**
* A helper function to paginate through a YouTube API list resource and get a simple total count.
* This is only used for subscriptions.
* @private
*/
function getTotalCount_(resource, options) {
let count = 0;
let pageToken = null;
const requestOptions = { ...options, maxResults: 50 };
do {
requestOptions.pageToken = pageToken;
const response = resource.list(requestOptions.part, requestOptions);
if (response.items) {
count += response.items.length;
}
pageToken = response.nextPageToken;
} while (pageToken);
return count;
}