Mějte přehled ve svých videích díky Google Scripts, Sheets a YouTube Data API

Možná víte, že jsem digital manažer výrobce značek Tefal, Krups, Rowenta pro ČR, SR a Maďarsko. A jedna z milých povinností, kterou mám na starosti, je i správa našich YouTube kanálů, kterých je celkem 5, plus jsou YouTube kanály našich spřátelených beauty blogerek atp.

Než jsem přišel, tak se to dělalo tak, že když někdo přidal YouTube video, tak pak vzal tu URL a napsal to do nějakého Excelu s nějakým názvem. Samozřejmě někdy zapomněl, nebyly tam popisky, náhledy atd.

Nesnáším, když se ztrácí čas prací, kterou lépe zastanou stroje a to je zrovna tento případ. Udělal jsem si proto jednoduchý Google (Sheets) Apps Script, který funguje takto:

  1. Vezme seznam všech listů v Google Tabulce a spustí nad nimi smyčku:
    • vezme název listu
    • zjistí, jestli existuje YouTube kanál, který se jmenuje jako název listu
    • když ano, smaže list a nahraje do něj seznam všech videí v daném YouTube kanálů – URL, URL obrázku, Titulek, Popis, Datum publikování
    • upraví formáty a např. funkcí IMAGE doplní aktuální obrázek videa
  2. A tenhle skript se spouští každou hodinu

Výsledkem tak je stále aktuální seznam všech videí na všech našich (resp. i cizích – libovolných zadaných) YouTube kanálech a když by někdo přidat nový kanál, tak prostě stačí přidat nový list, pojmenuje jej názvem kanálu a do hodiny se stáhne opět kompletní seznam (případně může stisknout tlačítko v menu a načte se hned). Je tam i záložka pro ruční zadávání videí, abychom měli přehled i o takových, která jsou na jiné službě nebo u někoho, u koho nepotřebujeme kompletní přehled.

Takže jak na to?

V první fázi je potřeba funkce, která stáhne seznam videí z YouTube přes standardní YouTube Service, která je součástí App Scriptu a využívá YouTube Data API.

Původně jsem se domníval, že to udělám jako funkci Tabulek, tedy že napíšu =youtube(„nazev-kanalu“) a ono to rovnou vyplní tabulku daty. Jenže jak jsem později zjistil, ve funkcích YouTube Service nefunguje, musel bych to řešit dotazováním na URL z Data API a to mi za to nestálo.

Funkce je to myslím primitivní, snad jedinou komplikací je to, že stahuji videa po 25. a stránkuji, abych se vyhnul problémům u obsáhlých kanálů. Z vrácené hodnoty (viz dokumentace k Playlistitems) vypreparuji kýžené detaily a ty ukládám do pole, které pak vracím jako výsledek funkce:

/**
* Return YouTube videos details for given channel
*
* @param {string} username YouTube channel name (username) - see channel URL
* @return Array representing key params of YouTube videos in given channel
*/
function getVideos(username) {
 var results = YouTube.Channels.list('contentDetails', {forUsername: username});
 var array = [];
 for(var i in results.items) {
 var item = results.items[i];
 // Get the playlist ID, which is nested in contentDetails, as described in the
 // Channel resource: https://developers.google.com/youtube/v3/docs/channels
 var playlistId = item.contentDetails.relatedPlaylists.uploads;
 
 var nextPageToken = '';
 
 // This loop retrieves a set of playlist items and checks the nextPageToken in the
 // response to determine whether the list contains additional items. It repeats that process
 // until it has retrieved all of the items in the list.
 while (nextPageToken != null) {
 var playlistResponse = YouTube.PlaylistItems.list('snippet', {
 playlistId: playlistId,
 maxResults: 25,
 pageToken: nextPageToken
 });
 
 for (var j = 0; j < playlistResponse.items.length; j++) {
 var playlistItem = playlistResponse.items[j];
 array.push([
 playlistItem.snippet.resourceId.videoId,
 playlistItem.snippet.thumbnails['default']['url'],
 playlistItem.snippet.title,
 playlistItem.snippet.description,
 playlistItem.snippet.publishedAt,
 
 ]);
 }
 nextPageToken = playlistResponse.nextPageToken;
 }
 }
 return array;
 }

Druhá funkce řeší to procházení všech listů v aktuální tabulce, zjištění názvů a vyplnění hodnot z YouTube:

function getSheetsVideos () {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  
  for (var n = 0; n < sheets.length ; n++ ) {    
    var sheet = ss.getSheets()[n];
    var sheetName = sheet.getName();
    var videos = (getVideos (sheetName)); 
    if (videos.length == 0) continue;
    sheet.clear();
    sheet.appendRow(['URL','Thumbnail','Title','Description', 'Published at']) ;
    var values = [];
    for (var video in videos) {
      values.push(["https://www.youtube"+".com/watch?v="+videos[video][0],'=image("'+videos[video][1]+'")',videos[video][2],videos[video][3], new Date(videos[video][4])]);
    }
    sheet.getRange(2, 1, videos.length , 5).setValues(values)    
    sheet.getDataRange().setVerticalAlignment("middle");
    sheet.setColumnWidth(1, 320);
    sheet.setColumnWidth(2, 120);
    sheet.setColumnWidth(3, 300);
    sheet.setColumnWidth(4, 400);    
    sheet.setColumnWidth(5, 100); 
    sheet.getRange("C:D").setWrap(true);
    sheet.getRange("1:1").setFontWeight("bold");
    sheet.getRange("C:C").setFontWeight("bold");
    for(var i=2; i<=videos.length+1; i++){
      sheet.setRowHeight(i, 90);
    };
  }
}

No a to je vlastně všechno, ještě jsem přidal funkci, která při otevření sešitu vytvoří položku v menu pro aktualizaci všech videí, kdybych to potřeboval rychleji než do hodiny:

function onOpen() {
 var ui = SpreadsheetApp.getUi();
 // Or DocumentApp or FormApp.
 ui.createMenu('Aktualizace')
 .addItem('Aktualizace všech videí', 'getSheetsVideos')
 .addToUi();
}

No a pak samozřejmě nastavit automatické stahování (Zdroje / Spouštěče aktuálního projektu). Před prvním spuštěním bylo také třeba zapnout podporu YouTube Data API (Zdroje / Pokročilé služby Google) a tuším to chtělo i nějakou autorizaci. Výsledek vidíte na obrázku

Podnět pro vás: co takhle tam přidat statistiky shlédnutí videí? Kdo se do toho vrhnete? Napovím – Google Apps Script YouTube Analytics Service.

Jeden komentář u “Mějte přehled ve svých videích díky Google Scripts, Sheets a YouTube Data API”

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *