Google Apps 脚本 API 调用返回"TypeError: Cannot read property '0' of undefined"需要它返回空字段



我正在尝试使用Google API获取有关Chromebook设备的一些信息。我知道有些设备不会有最近的用户,所以我希望该字段为空。当我包含device.recentUsers[0].email的行时,它运行了一段时间,然后当它达到"未定义"时,它停止并给出以下消息"TypeError:无法读取未定义的属性'0'"-我将字段更改为"device.recentUsers"以查看返回的内容,它显示整个字段是"未定义的"。

Google API文档定义"整个"字段如下我只需要电子邮件位,所以"device.recentUsers[0].email">

"recentUsers": [
{
"type": string,
"email": string
}

如何使电子邮件字段返回为"空"?我运行了一个测试来提取前三列和不带"[0].mail"位的"device.recentUsers"。从结果中,我可以得到"未定义"行的计数。所以我知道总记录数,以及其中有多少应该有空白电子邮件的预期细分。

检查字段中是否包含类似的内容

if ((device.status == 'ACTIVE') && (device.recentUsers) && (device.activeTimeRanges)) {

限制了输出,如果可以避免的话,我不想对数据库进行两次调用。这样做会返回语法错误

if (device.recentUsers) {
device.recentUsers[0].email,
} else {
device.recentUsers = 'BLANK',
}

我的脚本中没有注释上面提到的if语句,效果很好,但我也需要其他行!

function listDevices() {
var deviceArray = [];
var pageToken;
var page;
do {
page = AdminDirectory.Chromeosdevices.list(
'my_customer',
{
maxResults: 100,
pageToken: pageToken
});
var devices = page.chromeosdevices;
if (devices) {
for (i = 0; i < devices.length; i++) {
var device = devices[i];
//if ((device.status == 'ACTIVE') && (device.recentUsers) && (device.activeTimeRanges)) {
var row = [
device.serialNumber,
device.annotatedAssetId,
device.status,
device.recentUsers[0].email,
device.activeTimeRanges[0].date
];
//Logger.log(device.serialNumber,device.annotatedAssetId,device.status,device.recentUsers[0].email, device.activeTimeRanges[0].date);
deviceArray.push(row);
// } 
} 
}  
pageToken = page.nextPageToken;
} while (pageToken);
if (deviceArray.length > 0) {
var spreadsheet = SpreadsheetApp.create('TEST Device List');
var sheet = spreadsheet.getActiveSheet();
// Append the headers.
var headers = ['SerialNo', 'AssetTag', 'Status', 'LastUserEmail', 'LastDate'];
sheet.appendRow(headers);
// Append the results.
sheet.getRange(2, 1, deviceArray.length, headers.length).setValues(deviceArray);
Logger.log('TEST Device List spreadsheet created: %s', spreadsheet.getUrl());
} else {
Logger.log('No results returned.');
}
}

我发现了如何使用typeof((函数来处理这个问题。我修改了上面的代码,如果我已经评论出来的话:

if ((devices.length < i) || (typeof(device.recentUsers)=='undefined') || (typeof(device.activeTimeRanges)=='undefined')) {
var row = [
device.serialNumber,
device.annotatedAssetId,
device.status,
'',
''
];
} else {
var row = [
device.serialNumber,
device.annotatedAssetId,
device.status,
device.recentUsers[0].email,
device.activeTimeRanges[0].date
];          
} 
deviceArray.push(row);

最新更新