У меня есть скрипт, который извлекает пользовательские данные из каталога и помещает их в лист Google. Я получаю сообщение об ошибке, что у меня нет доступа и я все перепробовал. Понятия не имею почему.
Вот мой код:
var PRIVATE_KEY =
'-----BEGIN PRIVATE KEY--------END PRIVATE KEY-----\n';
var CLIENT_EMAIL = 'contacts@automation.iam.gserviceaccount.com';
var USER_EMAIL = 'admin@domain.com';
function getService() {
return OAuth2.createService('Domain:' + USER_EMAIL)
// Set the endpoint URL.
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
// Set the private key and issuer.
.setPrivateKey(PRIVATE_KEY)
.setIssuer(CLIENT_EMAIL)
// Set the name of the user to impersonate. This will only work for
// Google Apps for Work/EDU accounts whose admin has setup domain-wide
// delegation:
// https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority
.setSubject(USER_EMAIL)
// Set the property store where authorized tokens should be persisted.
.setPropertyStore(PropertiesService.getScriptProperties())
// Set the scope. This must match one of the scopes configured during the
// setup of domain-wide delegation.
.setScope('https://www.googleapis.com/auth/admin.directory.user.readonly');
}
function listAllUsers() {
var service = getService();
if (service.hasAccess()) {
var ss = SpreadsheetApp.getActive();
var pageToken,
page,
count = 0;
var listArray = [];
listArray.push(['full name', 'first name', 'last name', 'email', 'orgunit', 'department', 'title', 'phoneType', 'phoneNumber', 'ID'])
do {
page = AdminDirectory.Users.list({
domain: "domain.com", // Google Apps domain name
orderBy: "email",
pageToken : pageToken
});
var users = page.users;
if (users) {
for (var i = 0; i < users.length; i++) {
var user = users[i];
var department,
title, phonetype, phonenumber, orgunit; // Addded two new variables
try { // Try to get the users department if there is an error push the error to the array
department = user.organizations[0].department;
} catch (e) {
department = e
}
try {// Try to get the users title if there is an error push the error to the array
title = user.organizations[0].title;
} catch (e) {
title = e
}
try {// Try to get the users PhoneType if there is an error push the error to the array
phonetype = user.phones[0].type;
} catch (e) {
title = e
}
try {// Try to get the users PhoneNumber if there is an error push the error to the array
phonenumber = user.phones[0].value;
} catch (e) {
title = e
}
try {// Try to get the users PhoneNumber if there is an error push the error to the array
orgunit = user.organizations[0].name;
} catch (e) {
title = e
}
listArray.push([user.name.fullName, user.name.givenName, user.name.familyName, user.primaryEmail, orgunit, department, title, phonetype, phonenumber, user.id]);
}
}
pageToken = page.nextPageToken;
// This means you only get one page
} while (pageToken);
try {
var outputSheet = ss.getSheetByName('allMembers');
outputSheet.getDataRange();
} catch (err) {
var outputSheet = ss.insertSheet('allMembers', 2);
}
outputSheet.getDataRange().clear();
outputSheet.getRange(1, 1, listArray.length, listArray[0].length).setValues(listArray);
outputSheet.getRange(1, 6, outputSheet.getLastRow(), 4).setHorizontalAlignment("center");
outputSheet.getRange(1, 1, outputSheet.getLastRow(), 1).setHorizontalAlignment("center");
var width = [150, 150, 180, 250, 250, 200];
} }
Когда я запускаю его с viewtype domain_public, он работает, но извлекает только данные глобального каталога, а не скрытые данные, такие как организационные единицы.
Я получаю сообщение об ошибке «Не авторизован для доступа к этому ресурсу / API» (строка 41, файл «Код»)
Я убедился, что для проекта включены расширенные службы и API, учетная запись службы имеет делегирование по всему домену с областью действия: https://www.googleapis.com/auth/admin.directory.user.readonly
и я все еще не могу заставить его работать, что бы я ни пытался.
Я попытался добавить код авторизации из https://github.com/gsuitedevs/apps-script-oauth2, но, как вы можете видеть, он все еще не работает.