我的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);
}
答案 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
在这种情况下使用'默认'。