您会注意到有两个脚本,Page1和Page2,我确实删除了它们的触发器,因此必须手动运行它们才能执行任何操作。 Page1曾经用来更新“ Live”上的ID,而Page 2会用来更新“ Live 2”,它们曾经互相配合工作,但尽管我没有做任何改动,但现在似乎已经停止了。
在此先感谢您的帮助(对不起我的英语)
这是运行Page2时出现的错误
[20-04-05 23:04:48:376 BST] TypeError: Cannot read property 'getValues' of null
at getVideoIds(Code:27:22)
at updateStats(Code:18:18)
这是两个脚本的代码,唯一的区别是工作表名称和数据ID名称。
// This is "Sheet1" by default. Keep it in sync after any renames.
var SHEET_NAME = 'Live';
// This is the named range containing all video IDs.
var VIDEO_ID_RANGE_NAME = 'IDs';
// Update these values after adding/removing columns.
var Column = {
VIEWS: 'C',
LIKES: 'D',
DISLIKES: 'E',
COMMENTS: 'F',
DURATION: 'G'
};
function updateStats() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName(SHEET_NAME);
var videoIds = getVideoIds();
var stats = getStats(videoIds.join(','));
writeStats(stats);
}
// Gets all video IDs from the range and ignores empty values.
function getVideoIds() {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName(SHEET_NAME);
var range = spreadsheet.getRangeByName(VIDEO_ID_RANGE_NAME);
var values = range.getValues();
var videoIds = [];
for (var i = 0; i < values.length; i++) {
var value = values[i][0];
if (!value) {
return videoIds;
}
videoIds.push(value);
}
return videoIds;
}
// Queries the YouTube API to get stats for all videos.
function getStats(videoIds) {
return YouTube.Videos.list('contentDetails,statistics', {'id': videoIds}).items;
}
// Converts the API results to cells in the sheet.
function writeStats(stats) {
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName(SHEET_NAME);
var durationPattern = new RegExp(/PT((\d+)M)?(\d+)S/);
for (var i = 0; i < stats.length; i++) {
var cell = sheet.setActiveCell(Column.VIEWS + (2+i));
cell.setValue(stats[i].statistics.viewCount);
cell = sheet.setActiveCell(Column.LIKES + (2+i));
cell.setValue(stats[i].statistics.likeCount);
cell = sheet.setActiveCell(Column.DISLIKES + (2+i));
cell.setValue(stats[i].statistics.dislikeCount);
cell = sheet.setActiveCell(Column.COMMENTS + (2+i));
cell.setValue(stats[i].statistics.commentCount);
cell = sheet.setActiveCell(Column.DURATION + (2+i));
var duration = stats[i].contentDetails.duration;
var result = durationPattern.exec(duration);
var min = result && result[2] || '00';
var sec = result && result[3] || '00';
cell.setValue('00:' + min + ':' + sec);
}
}
答案 0 :(得分:0)
您提供的命名范围在此行中不存在:
var range = spreadsheet.getRangeByName(VIDEO_ID_RANGE_NAME_2);
如果您在电子表格中列出了所有范围,则会注意到没有名为Test
的命名范围-在这种情况下,Test
之前是工作表名称:'Live 2'!Test
:
var ss = SpreadsheetApp.getActive();
ss.getNamedRanges().forEach(namedRange => console.log(namedRange.getName()))
我建议您避免以这种方式命名范围,以避免此类问题。无论如何,您都可以通过更改分配给VIDEO_ID_RANGE_NAME_2
的值来解决此问题:
var VIDEO_ID_RANGE_NAME_2 = "'Live 2'!Test";
Page1
还是Page2
来为相应的函数提供不同的参数。