函数返回未定义的结果

时间:2018-10-22 13:55:21

标签: javascript google-apps-script admin-sdk

我正在尝试使用服务帐户为最终用户填充电子表格。

我正在使用此脚本来获取ChromeOS设备:

function listChromeOSDevices_(accessToken) {
  var devices = [];
  var pageToken;
  do {
    var params = {
      method: 'get',
      headers: {
        Authorization: 'Bearer ' + accessToken
      }
    };
    var url =
      'https://www.googleapis.com/admin/directory/v1/customer/my_customer/devices/chromeos?projection=full&orderBy=status&sortOrder=ascending&maxResults=100';
    if (pageToken) {
      url += '&pageToken=' + pageToken;
    }
    var urlResponse = UrlFetchApp.fetch(url, params);
    var jsonContent = JSON.parse(urlResponse.getContentText());
    devices = devices.concat(jsonContent.chromeosdevices);
    pageToken = jsonContent.nextPageToken;
  } while (pageToken);
  return devices;
}

然后尝试通过结果执行此操作:

function main() {
  var userEmail = 'admin@email.com';
  var accessToken = getOAuthToken(userEmail);
  var chromeOSDevices = listChromeOSDevices_(accessToken);
  var date = new Date().toLocaleDateString();
  var outputTableHeaders = [
     'Date and Duration of Usage',
     'Asset ID',
     'Location',
     'User',
     'Admin Notes',
     'Firmware Version',
     'Last Synchronised',
     'MAC Address',
     'Device Model',
     'Serial Number',
     'OS Version',
     'Platform Version',
     'Device Status',
     'OU Path'
   ];

  var deviceResults = [outputTableHeaders].concat(
    chromeOSDevices.map(function(device) {
      device = fillInMissing_(device);
      device.activeTimeRanges = sortArrByDateElement_(
        device.activeTimeRanges,
        'asc'
      );
      return [
        dateConv_(
          device.activeTimeRanges[device.activeTimeRanges.length - 1].date
        ) +
          ' for ' +
          msToReadable_(
            device.activeTimeRanges[device.activeTimeRanges.length - 1]
              .activeTime
          ),
        device.annotatedAssetId,
        device.annotatedLocation,
        device.annotatedUser,
        device.notes,
        device.firmwareVersion,
        device.lastSync,
        device.macAddress,
        device.model,
        device.serialNumber,
        device.osVersion,
        device.platformVersion,
        device.status,
        device.orgUnitPath
      ];
    })
  );
}

但是,我收到了错误消息TypeError: Cannot call method "hasOwnProperty" of undefined. dateConv_和msToReadable_函数是辅助函数-但这不是问题(已将它们删除并遇到相同的问题)。

在主代码中注销chromeOSDevices时,它会按预期返回设备(据我所知)。

但是,当尝试使用map时,结果几乎失去了任何其他属性。对此我有点不知所措,因为对我来说很好!

我以前曾经使用相同的方法来输出AdminDirectory.Chromeosdevices.list的结果(因此我知道地图正在工作),但是需要为某些不符合要求的用户使用服务帐户运行脚本的访问级别,而该级别已落空。

有人能弄清楚为什么吗?因为我一直坐在那里看了一两个小时,却一无所有...

修改
从脚本中删除辅助函数,我仍然收到错误:TypeError: Cannot read property "annotatedAssetId" from undefined.

编辑2
像这样注销:

  for (var index in chromeOSDevices) {
    Logger.log("INDEX: %s - The user is : %s",index,chromeOSDevices[index].annotatedUser)
      }

我得到以下答复:Response @ pastebin

0 个答案:

没有答案