无法读取未定义的 json 解析的属性'count'



我在Google apps脚本中有一个脚本,该脚本调用Facebook图形api,然后将数据解析为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);
}
//  
//

//精炼答案: 在执行 rows.push(( 调用之前,您可以跳过 dataSet for 循环中没有共享反应的帖子。

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']

但我希望您对数据值的其他引用以及反应和共享计数已经停止工作,并且您的其他引用可能也需要更新到数据[0][..形式。

最新更新