YouTube Playlist to Google Sheets: Titles and Links in One Run
On this page, 10 sections
To get a YouTube playlist into Google Sheets, copy the playlist ID from the URL (the part after list=), then run an Apps Script that calls playlistItems.list with maxResults: 50 and follows nextPageToken until it runs out. Each call returns up to 50 videos and costs 1 quota unit, so a 1,000-video playlist takes 20 calls.
I found no built-in Sheets function that reads a YouTube playlist, so the working routes are a script or an add-on. The script route is free and stays inside your own Google account.
I read the playlistItems.list reference, the channel resource page and the quota calculator on 11 October 2026. The script below follows those pages. I did not run it against a live playlist for this post.
Find the playlist ID
Open the playlist on YouTube. The address looks like youtube.com/playlist?list=PLxxxxxxxx. The text after list= is the playlist ID.
Every channel also has an uploads playlist. Google’s channel resource page describes contentDetails.relatedPlaylists.uploads as the ID of the playlist that contains the channel’s uploaded videos. That means the same script that lists a playlist also lists the videos in a channel’s uploads playlist. The full channel version of this on the site covers that route in more detail.
What the method accepts
playlistId: the playlist to read. A request must carry eitheridorplaylistId.part:snippetgives title, description, position andresourceId.contentDetailsis also a valid part, but the page does not say what it holds.maxResults: 0 to 50, default 5. Leave it out and you get 5 videos a page.pageToken: the cursor. The response includesnextPageTokenwhile there are more pages, and you stop when it is absent.
The default of 5 makes the same job ten times as many requests.
The script
function playlistToSheet() {
const playlistId = 'PASTE_PLAYLIST_ID';
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName('Playlist') || ss.insertSheet('Playlist');
sheet.clear();
sheet.appendRow(['Position', 'Title', 'Video ID', 'URL']);
const rows = [];
let pageToken = '';
do {
const res = YouTube.PlaylistItems.list('snippet', {
playlistId: playlistId,
maxResults: 50,
pageToken: pageToken
});
res.items.forEach(item => {
const s = item.snippet;
const id = s.resourceId.videoId;
rows.push([s.position, s.title, id, 'https://www.youtube.com/watch?v=' + id]);
});
pageToken = res.nextPageToken;
} while (pageToken);
if (rows.length) sheet.getRange(2, 1, rows.length, 4).setValues(rows);
}
Before you run it, open the editor’s Services panel and add the YouTube Data API v3 advanced service. Google’s Apps Script documentation describes advanced services as needing to be enabled before use. Then run the function and approve the permissions.
resourceId.videoId is the field the reference page’s own Ruby sample reads to get each video’s ID, which is why I use it. Google’s playlist item resource page lists it as snippet.resourceId.videoId; confirm it on your first run by looking at row 2.
What it costs
Google’s quota calculator lists playlistItems.list at 1 unit per call, and the default allocation is 10,000 units a day for everything outside search.list and videos.insert. The numbers below are my arithmetic.
- A 100-video playlist: 2 calls, 2 units.
- A 1,000-video playlist: 20 calls, 20 units.
- Ten playlists of 1,000 each: 200 calls, 200 units, about 2% of the daily default.
At the default of 5 items per page, the same 1,000-video playlist would take 200 calls, which is why maxResults: 50 matters. Both numbers are my arithmetic from the documented range and default.
Reading playlists is cheap against the 10,000-unit default. The 6 minute execution limit per run applies as well; Google’s Apps Script quotas page, last updated 3 September 2026, gives that figure for both consumer and Workspace accounts.
I did not time the script. Twenty requests is a small job against that limit, but a script that also fetches details for each video in a loop could reach it.
Add view counts, dates and duration
playlistItems.list tells you what is in the playlist, not how it is doing. For view counts you need a second call, videos.list, which also costs 1 unit. The reference describes its id parameter as a comma-separated list of video IDs and states no maximum on the page, so I cannot give you a verified batch size.
The pattern is: collect all the IDs, send them to videos.list in batches, and join the results on video ID. Start with a small batch and raise it until a request errors.
The site already has a walkthrough for video details. Run the playlist script first for the IDs, then use that method for the details.
Problems you will see
Deleted or private videos
A playlist can contain videos that are no longer public. The playlist item resource page documents status.privacyStatus as each playlist item’s privacy status, but it does not describe how a deleted or private video appears in the title or other fields, so I will not guess.
Run the script on a playlist you know has one, add status to the part list, and look at what lands in the title and status columns.
The playlist is private
I did not test a private playlist. The Apps Script service runs as the signed-in user, so sign in as the playlist’s owner and check row 2.
Titles come out in the wrong order
The position field in the snippet is the playlist order, so sort the sheet by that column instead of relying on how pages arrive.
Make the sheet useful after the import
A list of titles and links is only a start. Here is what I would do with it next.
- Add a status column and mark each video as watched, reviewed or needs updating. A playlist is often a course or a content archive, and this turns the sheet into a tracker.
- Add a hyperlink formula. Use
=HYPERLINK(D2, B2)to make the title clickable while keeping the URL in its own column. - Check for duplicates. The same video can appear in a playlist twice. A
COUNTIFon the Video ID column finds them. - Re-run on a trigger. A weekly trigger refreshes the tab so new additions show up.
If you are auditing a channel’s own content, compare this list against your uploads playlist. Anything in the uploads list that is in no playlist is a video no playlist links to. Whether that matters depends on how your viewers find your channel.
One more habit: write the IDs you have already collected into the sheet before you fetch anything about them. If the second stage fails, the first stage is still saved, and you re-run only the part that broke.
It also gives you a record of which videos were in the playlist on that day, since playlists change as owners add and remove items. I have not measured how often that happens, so treat it as a reason to keep a dated copy, not a statistic.
Questions people ask
Is there a Google Sheets function for a YouTube playlist?
Not one that I found in Google’s Sheets or Apps Script documentation. The Apps Script YouTube service is the supported path.
Can I update a playlist from the sheet?
Yes, but writes cost 50 units each, per the quota table (playlistItems.insert is 50). Adding 200 videos costs 10,000 units, a whole day’s default quota. Reads are cheap. Writes are not.
Can I do this without writing code?
I only checked Google’s own documentation. I did not test add-ons, so I have no verdict on them.
Do this today
Pick a playlist you care about, copy the ID after list=, paste the script, set maxResults: 50, run it. Check row 2 against the first video in the playlist.
Resources
- PlaylistItems: list, read 11 October 2026
- PlaylistItems resource, read 11 October 2026
- Channels resource, relatedPlaylists.uploads, read 11 October 2026
- YouTube Data API quota calculator, read 11 October 2026
- Apps Script quotas, read 11 October 2026