Могу ли я получить статистику видео с помощью YouTube API?

Я получаю эту ошибку, когда пытаюсь получить статистику:

«Исключение: количество строк в диапазоне должно быть не менее 1».

Без последней строки все работает хорошо.

Это код:

function YoutubeScraper() {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()

  var search = YouTube.Search.list ("snippet, id", {q: "searching youtube", maxResults: 30})

  var results = search.items.map((item) => [item.snippet.title, item.snippet.channelId, item.snippet.publishedAt])

  var ids = results.map ((id) => id[0]).join(",")

  var stats = YouTube.Videos.list ("statistics", {id: ids})

  var videoStats = stats.items.map((item) => [item.statistics.viewCount, item.statistics.likeCount, item.statistics.commentCount])
  
  sheet.getRange(2,1, results.length, results[0].length).setValues(results)
  sheet.getRange(2,3, videoStats.length, results[0].length).setValues(videoStats)
}

Я надеялся получить на своем активном листе список с результатами запроса и их статистикой. Можно получить результаты, но не статистику. Я пробовал изменить диапазон статистики, но это не сработало. Работает хорошо без последней строки, мой активный лист в Документах Google заполняется результатами (заголовок, идентификатор канала и время публикации), но не может заставить работать последнюю строку.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
80
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Точки модификации:

  • Я думаю, что в вашем сценарии значения var ids = results.map ((id) => id[0]).join(",") равны item.snippet.titleresults. При этом stats.items есть []. Я догадался, что это причина вашего текущего выпуска Exception: The number of rows in the range must be at least 1..
  • В этом случае необходимо использовать идентификаторы видео для YouTube.Videos.list.
  • Также в вашей ситуации я думаю, что значения можно поместить в ячейки одним вызовом с использованием идентификатора канала.

Когда эти моменты отражаются в вашем сценарии, получается следующее.

Модифицированный скрипт:

Прежде чем использовать этот скрипт, включите API данных YouTube в расширенных службах Google.

function YoutubeScraper() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var search = YouTube.Search.list("snippet, id", { q: "searching youtube", maxResults: 30 });
  var results = search.items.map((item) => [item.snippet.title, item.snippet.channelId, item.snippet.publishedAt]);

  // --- I modified the below script.
  if (search.items.length == 0) return;
  var ids = search.items.map(({ id: { videoId } }) => videoId || "").filter(String);
  var stats = YouTube.Videos.list(["statistics", "snippet"], { id: ids });
  var obj = stats.items.reduce((o, { snippet, statistics }) => (o[snippet.channelId] = [statistics.viewCount || 0, statistics.likeCount || 0, statistics.commentCount || 0], o), {});
  var values = results.map(e => [...e, ...(obj[e[1]] ? obj[e[1]] : Array(3).fill(null))]);
  sheet.getRange(2, 1, values.length, values[0].length).setValues(values);
}
  • При запуске этого сценария значения помещаются в ячейки активного листа.

Ссылка:

Огромное спасибо, Танаике!!! Хотел бы я полностью понять решение, но, увы, не могу. Еще раз спасибо!

Danilo Reuben 06.04.2024 13:17

@Danilo Reuben Что касается моей добавленной части: var ids =, идентификаторы видео получены из results. А в var stats = значения извлекаются с использованием идентификаторов видео. В var obj = создается объект для поиска идентификаторов каналов. В позиции var values = массив результатов создается с использованием results и obj. В последней строке массив результатов помещается на активный лист. Если это объяснение не было полезным, прошу прощения.

Tanaike 06.04.2024 14:17

Еще раз спасибо, Танаике! Я только что принял решение. И спасибо за объяснение, оно действительно проясняет процесс. 🙂

Danilo Reuben 09.04.2024 13:39

@Danilo Reuben Спасибо за ваш ответ. Я рад, что ваша проблема была решена. И тебе спасибо.

Tanaike 09.04.2024 13:46

Другие вопросы по теме