通过API将JSON拉入Google Sheet,导致单元格中的未定义值

时间:2015-01-02 10:18:10

标签: javascript json google-apps-script

我的API有一个问题我试图建立一个API来调用名为Streak的客户关系管理工具,我试图通过HTTP Basic Auth GET提取数据,它通过我的脚本解析JSON文件逻辑然后进入我的Google表格电子表格。经过几个小时的开发后,谷歌应用程序脚本正在完美地工作(根据我的要求),我的脚本是将字符串'undefined'插入我的谷歌工作表单元格,只要它找不到值,一个完全空的不存在的字段。

Google Sheet Output问题的图片如下所示 注意:我突出显示了导致我悲伤的字段属性名称和未定义的值 https://drive.google.com/file/d/0B4rXaBEqs2UzSU5fMFUxYW8zTm8/view?usp=sharing

可以在下面看到运行以将数百条记录外推到我的Google表格的整个代码片段。从我的理解我的问题是在语句row.push(字段1001 - > 1021),它总是试图将所有字段推送到工作表;但是,并非所有记录都包含这些字段,因为我可能没有在源CRM中填充它们。响应于此,脚本在我的工作表中的相应单元格中填充“未定义”字符串。

我希望防止这个“未定义”的字符串被填充在工作表中,而不是这个单元格应该是空白的,有人可以建议我如何调整我的代码片段来实现这一目标吗?非常感激!我已经尝试了将近2-3个小时来解决这个问题但我没有足够的经验来找到答案,我尝试了各种IF语句并研究了定义变量类型(即整数,浮点数,字符等)上班。我相信一旦你知道它,解决方案很简单,非常感谢你的帮助!

//Within this API we need to achieve collecting my data from Streak CRM us
//
//  Notes on Google API 
//      https://developers.google.com/apps-script/guides/services/external
//
//  Notes on Streak API
//    https://www.streak.com/api/
//
//API Key YOUR_API_KEY Here

function myStreak() {

//Google Sheet Data
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheets = ss.getSheets();
  var sheet = ss.getSheetByName("StreakCRM"); 


//Streak API Call  
 var consumerKey = 'YOUR_API_KEY_HERE'
 var url = "https://www.streak.com/api/v1/boxes";  
 var headers = {
             "contentType": "application/json",
             "headers":{
"User-Agent": "MY_APP_NAME (App URL/your email address)",
               "Authorization": "Basic " + Utilities.base64Encode(consumerKey)
             },
             "validateHttpsCertificates" :false
             };

//Fetch Streak Data  
 var response = UrlFetchApp.fetch(url, headers);
 var dataAll = JSON.parse(response.getContentText());

//Write Captured Streak Data to Google Sheet  
 var dataSet = dataAll;  
 var rows = [],
  data; 

  for (i = 0; i < dataSet.length; i++) {
  data = dataSet[i];
  rows.push([data.name,
               data.stageKey,
//             data.fields['1001'], empty field
               data.fields['1002'],
               data.fields['1003'],
//             data.fields['1004'], empty field
               data.fields['1005'],
               data.fields['1006'],
               data.fields['1007'],
               data.fields['1008'],
               data.fields['1009'],
               data.fields['1010'],
               data.fields['1011'],
               data.fields['1012'],
//             data.fields['1013'], empty field
               data.fields['1014'],
               data.fields['1015'],
//             data.fields['1016'], empty field
               data.fields['1017'],
               data.fields['1018'],
               data.fields['1019'],
//             data.fields['1020'], empty field
               data.fields['1021'],
               data.fields['1023']]);//your JSON entities here
}

  dataRange = sheet.getRange(3, 1, rows.length, 19); // 19 Denotes total number of entites
  dataRange.setValues(rows);

//Capture response code success or errors
var text = response.getResponseCode();
Logger.log(text);
Logger.log(response);
}

2 个答案:

答案 0 :(得分:0)

这是预期的行为,因为这些属性完全从给定的数据行中丢失,它们是未定义的变量。将未定义的变量写入工作表时,会将其转换为字符串“undefined”。

要处理此问题,您应该检查每个属性名称以确保它存在,以及它是否不使用所需的默认值。

您提到过您尝试了各种If语句。检查值是否明确未定义的方法是:

if(data.fields['somefieldname'] === undefined)

但是,通常您只想知道值的计算结果是否为false,在这种情况下您只需执行以下操作:

if(data.fields['somefieldname'])

如果 data.fields ['somefieldname'] 是任何评估为false的值,例如 null false , 0 undefined ,对于任何其他值都为true。

最后,由于if语句对于这种特殊用法来说有点长,我建议使用“条件运算符”或“三元运算符”来处理代码:

   ( (data.fields['1002'])? data.fields['1002'] : '' )

如果data.fields ['1002']为真,则可以读为“”,返回data.fields ['1002'],否则返回空字符串

以下是有条件运算符的一些文档: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator

在代码的snippit中,它看起来像这样:

rows.push([data.name,
               data.stageKey,
//             data.fields['1001'], empty field
               (data.fields['1002'])?data.fields['1002']:'',
               (data.fields['1003'])?data.fields['1002']:'',
               ...
               ...
            ]);

例如,您可以为“else”条件指定任何值,例如0而不是空字符串。

答案 1 :(得分:0)

你已经接受了一个很好的答案,但是如果我能提供另一种改进的方法。

//Write Captured Streak Data to Google Sheet  
  var dataSet = dataAll,
      rows = [],
      data,
      dataFields = ['name', 'stageKey', '1001' … ]; //include all the JSON fields you want to transfer including any deliberate blanks you don't exist. 

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

  rows.push(dataFields.map(function (f) {
    return data[f] || '';
  });
}

这里的要点是在开始时控制数据字段的直接映射。

在循环结束时,你会看到三元的另一种替代方案,如果投入了很好的话。

return data[f] || '';

其形式为

var foo = bar || 'default';

||是您在if语句中知道的OR。实际上,这种模式说“让foo成为bar,除非falsey在这种情况下使用'默认'。