为什么第二个脚本停止工作?

时间:2020-04-05 23:51:43

标签: google-apps-script google-sheets

Link to Spreadsheet

您会注意到有两个脚本,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);
  }
}

1 个答案:

答案 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来为相应的函数提供不同的参数。

参考:

相关问题