我在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][..形式。