WedX - журнал о программировании и компьютерных науках

Не удается прочитать свойство «счетчик» неопределенного синтаксического анализа json

У меня есть скрипт в скрипте приложений Google, который вызывает api графика Facebook, а затем анализирует данные на листе Google. Все работало нормально, пока два дня назад я не начал получать ошибку «Не удается прочитать свойство« количество »неопределенного».

Когда я вызываю API, я получаю это обратно

{
   "data": [
      {
         "permalink_url": "url?substory_index=0",
         "created_time": "time",
         "message": "message"
            "shares": {
            "count": 455
         },
         "reactions": {
            "data": [

            ],
            "summary": {
               "total_count": 555,
               "viewer_reaction": "NONE"
            }
         },
         "comments": {
            "data": [

            ],
            "summary": {
               "order": "ranked",
               "total_count": 345,
               "can_comment": false
            }  

Но затем, когда скрипт пытается запуститься, он получает ошибку «Не удается прочитать свойство «количество» неопределенного». Ошибка относится к этой строке в моем скрипте

rows.push([new Date(),data.created_time,data.message,data.permalink_url,data.shares.count,data.reactions.summary.total_count,data.comments.summary.total_count

Он не работает только для data.share.count и data.reactions.summary.total_Count.

У кого-нибудь есть идеи, что могло внезапно пойти не так?

Весь скрипт

function getAPIdata() {
    var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName('sheetname');
  var range = sheet.getRange("A:C");
  var response = UrlFetchApp.fetch("API CALL");
  var dataAll = JSON.parse(response.getContentText());
  var dataSet = dataAll.data;
  var rows = [],
    data;
  for (i = 0; i < dataSet.length; i++) {
    data = dataSet[i];
    rows.push([new Date(),data.created_time,data.message,data.permalink_url,
               data.reactions.summary.total_count
               ,data.comments.summary.total_count,data.insights.data[1].values[0].value,data.insights.data[2].values[0].value,data.insights.data[3].values[0].value,data.insights.data[0].values[0].value['link clicks'],data.insights.data[0].values[0].value['photo view'],data.insights.data[0].values[0].value['other clicks'],data.insights.data[0].values[0].value['video play'],data.insights.data[4].values[0].value,data.insights.data[5].values[0].value,data.insights.data[6].values[0].value,data.insights.data[7].values[0].value["like"],data.insights.data[7].values[0].value["love"],data.insights.data[7].values[0].value["wow"],data.insights.data[7].values[0].value["haha"],data.insights.data[7].values[0].value["sorry"]]); //your JSON entities here
  }
  Logger.log(rows)
  //sheet.getRange(getlastRow() + 1, 1, rows.length, 2).setValues(rows);
  sheet.getRange(sheet.getLastRow() + 1, 1, rows.length, 22).setValues(rows);





/**
 * Removes duplicate rows from the current sheet.
 */

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('sheetname');
  var data = sheet.getDataRange().getValues();

  data.reverse(); //reverses the row order.

  var last=sheet.getLastRow();
  var newData = new Array();
  for(i in data){
    //Logger.log(i);
    var row = data[i];
    //Logger.log(row[5]);
    var duplicate = false;
    for(j in newData){
      //Logger.log(newData[j][3]);
      if(row[3] == newData[j][3]){
        duplicate = true;
      }
    }
    if(!duplicate){
      newData.push(row);
    }
  }

  newData.reverse(); // reverses your data back to its original order.

  sheet.clearContents();
  sheet.getRange(1, 1, newData.length, newData[0].length).setValues(newData);
  }
//  
  //
13.05.2020

Ответы:


1

//Уточненный ответ: вы можете пропускать сообщения без репостов И реакций в вашем наборе данных для цикла перед вызовом rows.push().

for (i = 0; i < dataSet.length; i++) 
{
    data = dataSet[i];

    //skip post with no shares
    if (data.shares == undefined) 
    { 
        continue; 
    }

    //skip post with no reactions
    if (data.reactions == undefined)
    {
        continue;
    }

    //rows.push (...
}

Если вы хотите включить только сообщения, которые имеют реакции ИЛИ, вам нужно будет инициализировать значения счетчика равными 0, а не пропускать их заранее (а затем проверить, равны ли оба счетчика 0, чтобы пропустить):

//Set share count to 0 for post with no shares
if (data.shares == undefined) 
{ 
    data.shares = {};
    data.shares.count = 0; 
}

//Set reactions count to 0 for post with no reactions
if (data.reactions == undefined) 
{ 
    data.reactions = {};
    data.reactions.summary = {}
    data.reactions.summary.total_count = 0;
}


//skip posts that don't contain shares OR reactions
if (data.shares.count == 0 && data.reactions.summary.total_count == 0)
{
    continue;
}

// Исходный ответ: похоже, что данные содержат массив значений, тогда как это могло бы быть не так, если бы ваш код работал раньше.

Я не вижу количество долей в предоставленном вами неполном/недействительном образце данных, но похоже, что теперь вам нужно ссылаться на суммарное количество реакций как:

data[0]['reactions']['summary']['total_count']

И я предполагаю, что ссылка на количество акций должна выглядеть так:

data[0]['shares']['count']

Но я ожидаю, что ваши другие ссылки на значения данных перестанут работать, а также реакции и счетчики общего доступа, и ваши другие ссылки, вероятно, также необходимо будет обновить до формы data[0][..

13.05.2020
  • Привет, @RichardMc. Спасибо за ответ. Я отредактировал исходный код, чтобы показать вам количество репостов. (Плохо справился с копированием) JSON выглядит точно так же, как и раньше, за исключением того, что эти две вещи ломаются. Я попробовал то, что вы сказали, но, к сожалению, мне не повезло. Любая другая ссылка работает отлично 13.05.2020
  • Хорошо, спасибо, Андреас, это помогает подтвердить мое предположение, но образец данных все еще является неполной структурой. В любом случае, я думаю, что вижу достаточно, чтобы знать, что вы возвращаете массив, поэтому ваши ссылки должны быть изменены, чтобы учесть это, как я уже упоминал в своем ответе выше. Надеюсь, это поможет вам разобраться. 13.05.2020
  • Я не думаю, что это так, поскольку все остальные ссылки работают идеально. Хотя до сих пор не могу понять, что не так. 13.05.2020
  • Привет, @Ричард. Все-таки нашел решение. Был пост, который был удален, поэтому не было записей для реакций или репостов. Это создало проблему. 13.05.2020
  • Ха-ха, круто, Андреас. Я просто обдумывал это как возможность, пока обедал! Это объясняет, почему акции отсутствовали в данных вашего примера. Рад, что ты это понял :) 13.05.2020
  • Ну, почти. Теперь мне нужно найти способ пропустить этот пост или исключить его. Любые идеи по этому поводу? Еще раз спасибо за вашу помощь. 13.05.2020
  • Что-то вроде этого? Проверьте, определен ли data.shares, в противном случае инициализируйте его {} и установите для .count значение 0 или продолжайте пропускать его, если вы обрабатываете это в цикле... if (data.shares == undefined) { data.shares = { }; data.shares.count = 0; //или продолжить; если вы в петле? } 13.05.2020
  • @Andreas Андреас Я усовершенствовал свой ответ кодом из моего последнего комментария, чтобы вы могли лучше видеть код с подсветкой синтаксиса и отступами. 13.05.2020
  • вроде нуб здесь, как вы, возможно, понял. Я загружаю весь сценарий, который у меня есть в исходном вопросе. Не могли бы вы показать мне, где я должен поместить код, чтобы, если общие ресурсы не определены, этот пост нужно было пропустить? Большое спасибо 13.05.2020
  • @Andreas Пожалуйста, посмотрите мой уточненный ответ, я надеюсь, что это то, что вы ищете. 13.05.2020
  • Большое спасибо, Ричард. Работал как шарм! 13.05.2020
  • @Andreas Отлично, рад помочь! Пожалуйста, примите мой рабочий ответ как решение, спасибо. 13.05.2020
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]