Почему второй скрипт перестал работать? - PullRequest
0 голосов
/ 06 апреля 2020

Ссылка на электронную таблицу

вы заметите, что есть два сценария, Page1 и Page2, я удалил их триггеры, поэтому их нужно было запускать вручную, чтобы что-то делать. Page1 раньше обновлял идентификаторы в «Live», а страница 2 обновляла «Live 2», раньше они работали рядом друг с другом, но теперь, похоже, остановились, несмотря на то, что я ничего не изменил.

Заранее спасибо за любую помощь (и извините за мой engli sh)

Вот ошибка, которая появляется при запуске 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)

Это код для обоих сценарии, единственное отличие состоит в имени листа и имени идентификатора данных.

// 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 голосов
/ 06 апреля 2020

Вы предоставляете именованный диапазон, который не существует в этой строке:

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.

Ссылка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...