Я получаю эту ошибку, когда пытаюсь получить статистику:
«Исключение: количество строк в диапазоне должно быть не менее 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 заполняется результатами (заголовок, идентификатор канала и время публикации), но не может заставить работать последнюю строку.
var ids = results.map ((id) => id[0]).join(",")
равны item.snippet.title
results
. При этом 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 Что касается моей добавленной части: var ids =
, идентификаторы видео получены из results
. А в var stats =
значения извлекаются с использованием идентификаторов видео. В var obj =
создается объект для поиска идентификаторов каналов. В позиции var values =
массив результатов создается с использованием results
и obj
. В последней строке массив результатов помещается на активный лист. Если это объяснение не было полезным, прошу прощения.
Еще раз спасибо, Танаике! Я только что принял решение. И спасибо за объяснение, оно действительно проясняет процесс. 🙂
@Danilo Reuben Спасибо за ваш ответ. Я рад, что ваша проблема была решена. И тебе спасибо.
Огромное спасибо, Танаике!!! Хотел бы я полностью понять решение, но, увы, не могу. Еще раз спасибо!