I finally managed to do something I've wanted to do for a while:
Get a list of all our google domain users data, so I can make a contacts app with thumbnail images and all. Getting the thumbnails to show was a real pain in the ***, as the thumbnails will only show privately through directory services. So I had to do a workaround.
This script is not for the faint of heart to implement. You need to have administrator privileges and add the right services to the apps script. This you have to figure out yourself.
EDIT: I noticed a part of the script changed when adding it here as code:
"data:" it shold be "data:"
function listAllUsers() {
var ss = SpreadsheetApp.getActive();
const baseURL = "https://admin.googleapis.com/admin/directory/v1/users/"
var pageToken,
page,
count = 0;
var listArray = [];
listArray.push(['Full Name', 'First name', 'Last name', 'Email','Phone', 'Job Title', 'Department', 'EmployeeNumber', 'Thumbnail'])
do {
page = AdminDirectory.Users.list({
domain : 'mydomain.com',
orderBy : 'givenName',
pageToken : pageToken
});
var users = page.users;
if (users) {
for (var i = 0; i < users.length; i++) {
var user = users[i];
let endPoint = "/photos/thumbnail";
let url = baseURL + user.primaryEmail + endPoint;
let headers = {"Authorization": "Bearer " + ScriptApp.getOAuthToken()};
let parameters = {
'method': 'GET' ,
'pageToken': pageToken,
'muteHttpExceptions': true,
'headers': headers
};
let urlResult = (url);
let data = UrlFetchApp.fetch(url, parameters);
let resultData = JSON.parse(data);
let photo = resultData.photoData;
if (photo === undefined) {
encodedPhoto = "data:image/jpeg;base64,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";}
else {encodedPhoto = "data:image/jpeg;base64," + resultData.photoData.replace(/_/g,'/').replace(/-/g,'+'); }
console.log(encodedPhoto);
var department,
title, ID; // 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 title if there is an error push the error to the array
userID = user.externalIds[0].value;
} catch (e) {
userID = e
}
function generatePhonesCell(phones) {
return phones
.map(phone => {
const value = phone.value
const type = phone.type.replaceAll('_', ' ')
return `${value} ` //(${type})
}
)
.join('\n')
}
listArray.push([user.name.fullName, user.name.givenName, user.name.familyName, user.primaryEmail, generatePhonesCell(user.phones || []),title, department, userID, encodedPhoto ]);
}
}
pageToken = page.nextPageToken;
break; // This means you only get one page
} while (pageToken);
try {
var outputSheet = ss.getSheetByName('googleUsers');
outputSheet.getDataRange();
} catch (err) {
var outputSheet = ss.insertSheet('googleUsers', 2);
}
outputSheet.getDataRange().clear();
outputSheet.getRange(1, 1, listArray.length, listArray[0].length).setValues(listArray);
}