Результат возврата функции не определен - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь использовать служебную учетную запись для заполнения электронной таблицы для конечных пользователей.

Я использую этот скрипт для получения устройств 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 в основном коде он возвращает устройства, как и ожидалось (насколько я могу судить).

Однако при попытке использовать карту это почти так, как если бырезультаты потеряли какие-либо дополнительные свойства.С некоторой растерянностью это выглядит для меня нормально!

Ранее я использовал тот же метод для вывода результатов 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

...