Skip to content

Commit 8045e30

Browse files
committed
Added exception for non-super admin users
Added exception to scripts that require Super Admin privilege.
1 parent c60adba commit 8045e30

File tree

2 files changed

+136
-103
lines changed

2 files changed

+136
-103
lines changed

getAppPasswords.gs

Lines changed: 70 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,74 @@
11
/**
2-
* This script will inventory names of all configured App Passwords from all users in an organization.
3-
*
4-
*/
2+
 * This script will inventory names of all configured App Passwords from all users in an organization.
3+
 *
4+
 */
55

66
function getAppPasswords() {
7-
const userEmail = Session.getActiveUser().getEmail();
8-
const domain = userEmail.split("@").pop();
9-
10-
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
11-
// Check for existing sheet and handle duplicates
12-
let appPasswordsSheet = spreadsheet.getSheetByName("App Passwords");
13-
if (appPasswordsSheet) {
14-
// If the sheet exists, delete it first
15-
spreadsheet.deleteSheet(appPasswordsSheet);
16-
}
17-
18-
// Create a new sheet with the desired name
19-
appPasswordsSheet = spreadsheet.insertSheet("App Passwords", spreadsheet.getNumSheets());
20-
21-
// Sheet styling (concise)
22-
const headerRange = appPasswordsSheet.getRange("A1:E1");
23-
headerRange.setFontFamily("Montserrat")
24-
.setBackground("#fc3165")
25-
.setFontColor("white")
26-
.setFontWeight("bold")
27-
.setValues([["CodeID", "Name", "Creation Time", "Last Time Used", "User"]]);
28-
29-
appPasswordsSheet.setFrozenRows(1);
30-
31-
let pageToken = null;
32-
do {
33-
const response = AdminDirectory.Users.list({
34-
domain: domain,
35-
customer: "my_customer",
36-
maxResults: 100,
37-
projection: "FULL",
38-
viewType: "admin_view",
39-
orderBy: "email",
40-
pageToken: pageToken,
41-
});
42-
43-
if (response.users && response.users.length > 0) {
44-
processUsers(response.users, appPasswordsSheet);
7+
try { // <-- Moved the try block here
8+
const userEmail = Session.getActiveUser().getEmail();
9+
const domain = userEmail.split("@").pop();
10+
11+
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
12+
// Check for existing sheet and handle duplicates
13+
let appPasswordsSheet = spreadsheet.getSheetByName("App Passwords");
14+
if (appPasswordsSheet) {
15+
// If the sheet exists, delete it first
16+
spreadsheet.deleteSheet(appPasswordsSheet);
4517
}
4618

47-
pageToken = response.nextPageToken;
48-
} while (pageToken);
19+
// Create a new sheet with the desired name
20+
appPasswordsSheet = spreadsheet.insertSheet("App Passwords", spreadsheet.getNumSheets());
21+
22+
// Sheet styling (concise)
23+
const headerRange = appPasswordsSheet.getRange("A1:E1");
24+
headerRange.setFontFamily("Montserrat")
25+
.setBackground("#fc3165")
26+
.setFontColor("white")
27+
.setFontWeight("bold")
28+
.setValues([["CodeID", "Name", "Creation Time", "Last Time Used", "User"]]);
29+
30+
appPasswordsSheet.setFrozenRows(1);
31+
32+
let pageToken = null;
33+
do {
34+
const response = AdminDirectory.Users.list({
35+
domain: domain,
36+
customer: "my_customer",
37+
maxResults: 100,
38+
projection: "FULL",
39+
viewType: "admin_view",
40+
orderBy: "email",
41+
pageToken: pageToken,
42+
});
4943

50-
// Auto-resize and add filter after data is populated
51-
appPasswordsSheet.autoResizeColumns(1, 5);
52-
const lastRow = appPasswordsSheet.getLastRow();
53-
appPasswordsSheet.getRange('B1:E' + lastRow).createFilter();
44+
if (response.users && response.users.length > 0) {
45+
processUsers(response.users, appPasswordsSheet);
46+
}
47+
48+
pageToken = response.nextPageToken;
49+
} while (pageToken);
50+
51+
// Auto-resize and add filter after data is populated
52+
appPasswordsSheet.autoResizeColumns(1, 5);
53+
const lastRow = appPasswordsSheet.getLastRow();
54+
appPasswordsSheet.getRange('B1:E' + lastRow).createFilter();
55+
56+
} catch (e) {
57+
if (e.message.indexOf("User does not have credentials to perform this operation") > -1) {
58+
// Display a modal dialog box for the error message
59+
const ui = SpreadsheetApp.getUi();
60+
ui.alert(
61+
'Insufficient Permissions',
62+
'You need Super Admin privileges to use this feature',
63+
ui.ButtonSet.OK
64+
);
65+
// Log the detailed error for debugging
66+
Logger.log(e);
67+
} else {
68+
// For other errors, re-throw the exception
69+
throw e;
70+
}
71+
}
5472
}
5573

5674
function processUsers(users, sheet) {
@@ -78,10 +96,10 @@ function processUsers(users, sheet) {
7896
for (let i = 0; i < data.length; i += batchSize) {
7997
const chunk = data.slice(i, i + batchSize); // Get the current chunk of data
8098
const numRows = chunk.length; // Number of rows in the current chunk
81-
99+
82100
// Write only the necessary number of rows
83-
sheet.getRange(sheet.getLastRow() + 1, 1, numRows, chunk[0].length)
84-
.setValues(chunk);
101+
sheet.getRange(sheet.getLastRow() + 1, 1, numRows, chunk[0].length)
102+
.setValues(chunk);
85103
}
86104
}
87105

@@ -92,13 +110,9 @@ function formatTimestamp(timestampString) {
92110
} else if (typeof timestampString === "string" && timestampString.length >= 13) {
93111
const timestamp = parseInt(timestampString.slice(0, 13));
94112
const date = new Date(timestamp);
95-
return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
113+
return Utilities.formatDate(date, Session.getScriptTimeZone(), "yyyy-MM-dd HH:mm:ss");
96114
} else {
97115
Logger.log("Unknown timestamp format: " + timestampString);
98116
return "Invalid Timestamp";
99117
}
100-
}
101-
102-
103-
104-
118+
}

getDomainInfo.gs

Lines changed: 66 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,71 @@
11
function getDomainInfo() {
2-
// Create a Customers list query request
3-
const customerDomain = "my_customer";
4-
const domainInfo = AdminDirectory.Customers.get(customerDomain);
2+
try {
3+
// Create a Customers list query request
4+
const customerDomain = "my_customer";
5+
const domainInfo = AdminDirectory.Customers.get(customerDomain);
56

6-
// Get the active spreadsheet
7-
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
7+
// Get the active spreadsheet
8+
const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
89

9-
const sheets = spreadsheet.getSheets();
10-
const lastSheetIndex = sheets.length;
10+
const sheets = spreadsheet.getSheets();
11+
const lastSheetIndex = sheets.length;
1112

12-
// Delete the "General Account Settings" sheet if it exists
13-
let existingSheet = spreadsheet.getSheetByName('General Account Settings');
14-
if (existingSheet) {
15-
spreadsheet.deleteSheet(existingSheet);
16-
}
13+
// Delete the "General Account Settings" sheet if it exists
14+
let existingSheet = spreadsheet.getSheetByName('General Account Settings');
15+
if (existingSheet) {
16+
spreadsheet.deleteSheet(existingSheet);
17+
}
18+
19+
// Create the "General Account Settings" sheet at the last index
20+
const generalSheet = spreadsheet.insertSheet('General Account Settings', lastSheetIndex);
21+
22+
// Set up the sheet with headers, formatting, and column sizes
23+
generalSheet.getRange('A1:M1').setValues([['Customer Workspace ID', 'Primary Domain', 'Organization Name', 'Language', 'Customer Contact', 'Address1', 'Address2', 'Postal Code', 'Country Code', 'Region', 'Locality', 'Phone number', 'Alternate Email']]);
24+
generalSheet.getRange('A1:M1').setFontWeight('bold').setBackground('#fc3165').setFontColor('#ffffff');
25+
generalSheet.autoResizeColumns(1, 13);
26+
generalSheet.setColumnWidth(1, 150);
27+
generalSheet.setColumnWidth(2, 186);
28+
generalSheet.setColumnWidth(6, 150);
29+
generalSheet.setColumnWidth(7, 186);
30+
generalSheet.getRange('2:2').setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
1731

18-
// Create the "General Account Settings" sheet at the last index
19-
const generalSheet = spreadsheet.insertSheet('General Account Settings', lastSheetIndex);
20-
21-
// Set up the sheet with headers, formatting, and column sizes
22-
generalSheet.getRange('A1:M1').setValues([['Customer Workspace ID', 'Primary Domain', 'Organization Name', 'Language', 'Customer Contact', 'Address1', 'Address2', 'Postal Code', 'Country Code', 'Region', 'Locality', 'Phone number', 'Alternate Email']]);
23-
generalSheet.getRange('A1:M1').setFontWeight('bold').setBackground('#fc3165').setFontColor('#ffffff');
24-
generalSheet.autoResizeColumns(1, 13);
25-
generalSheet.setColumnWidth(1, 150);
26-
generalSheet.setColumnWidth(2, 186);
27-
generalSheet.setColumnWidth(6, 150);
28-
generalSheet.setColumnWidth(7, 186);
29-
generalSheet.getRange('2:2').setBorder(true, true, true, true, true, true, '#000000', SpreadsheetApp.BorderStyle.SOLID);
30-
31-
// Append a new row with customer data
32-
generalSheet.appendRow([
33-
domainInfo.id,
34-
domainInfo.customerDomain,
35-
domainInfo.postalAddress.organizationName,
36-
domainInfo.language,
37-
domainInfo.postalAddress.contactName,
38-
domainInfo.postalAddress.addressLine1,
39-
domainInfo.postalAddress.addressLine2,
40-
domainInfo.postalAddress.postalCode,
41-
domainInfo.postalAddress.countryCode,
42-
domainInfo.postalAddress.region,
43-
domainInfo.postalAddress.locality,
44-
domainInfo.phoneNumber,
45-
domainInfo.alternateEmail,
46-
]);
47-
48-
// Delete cells N-Z and rows 3-1000
49-
generalSheet.deleteColumns(14, 13);
50-
generalSheet.deleteRows(3, 998);
51-
generalSheet.autoResizeColumns(1, generalSheet.getLastColumn());
52-
}
32+
// Append a new row with customer data
33+
generalSheet.appendRow([
34+
domainInfo.id,
35+
domainInfo.customerDomain,
36+
domainInfo.postalAddress.organizationName,
37+
domainInfo.language,
38+
domainInfo.postalAddress.contactName,
39+
domainInfo.postalAddress.addressLine1,
40+
domainInfo.postalAddress.addressLine2,
41+
domainInfo.postalAddress.postalCode,
42+
domainInfo.postalAddress.countryCode,
43+
domainInfo.postalAddress.region,
44+
domainInfo.postalAddress.locality,
45+
domainInfo.phoneNumber,
46+
domainInfo.alternateEmail,
47+
]);
48+
49+
// Delete cells N-Z and rows 3-1000
50+
generalSheet.deleteColumns(14, 13);
51+
generalSheet.deleteRows(3, 998);
52+
generalSheet.autoResizeColumns(1, generalSheet.getLastColumn());
53+
54+
} catch (e) {
55+
// Check if the error is due to insufficient permissions
56+
if (e.message.indexOf("Not Authorized to access this resource/api") > -1) {
57+
// Display a modal dialog box for the error message
58+
const ui = SpreadsheetApp.getUi();
59+
ui.alert(
60+
'Insufficient Permissions',
61+
'You need Super Admin privileges to use this feature.',
62+
ui.ButtonSet.OK
63+
);
64+
// Log the detailed error for debugging
65+
Logger.log(e);
66+
} else {
67+
// For other errors, re-throw the exception
68+
throw e;
69+
}
70+
}
71+
}

0 commit comments

Comments
 (0)