This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Demo authorization workflow that checks whether the current user can run this Apps Script, uses | |
* the Admin SDK Directory Advanced Service | |
* Twitter thread here: https://twitter.com/pfelipm/status/1576954653425618945 | |
* @pfelipm (OCT/22) | |
* | |
* @OnlyCurrentDoc | |
*/ | |
// Generates the proper script's menu depending on the activation status for current user | |
function onOpen(e) { | |
const status = PropertiesService.getScriptProperties() | |
.getProperty(Session.getActiveUser().getEmail()); | |
buildMenu(JSON.parse(status)); | |
} | |
// Builds the script's menu, 3 possibilites: | |
// (1) status === true → real menu | |
// (2) status === false → fake menu with a warning | |
// (3) status === null → Only displays an activation command | |
function buildMenu(status) { | |
const ui = SpreadsheetApp.getUi(); | |
switch (status) { | |
case true: | |
ui.createMenu('My script') | |
.addItem('Run automation', 'run') | |
.addToUi(); | |
break; | |
case false: | |
ui.createMenu('My script') | |
.addItem('⛔ Sorry, you should not attempt to use this script', 'doNothing') | |
.addToUi(); | |
break; | |
case null: | |
ui.createMenu('My script') | |
.addItem('🚨 Activate script first (run twice!)', 'activate') | |
.addToUi(); | |
break; | |
} | |
} | |
// Script activation | |
function activate() { | |
const userEmail = Session.getActiveUser().getEmail(); | |
const canRun = checkRun(userEmail); | |
PropertiesService.getScriptProperties() | |
.setProperty(userEmail, JSON.stringify(canRun)); | |
buildMenu(canRun); | |
} | |
// Check function to decide if the current user should attempt to run the script | |
// (e.g., if Google Workspace Admin) | |
function checkRun(userEmail) { | |
let isAdmin = false; | |
try { | |
isAdmin = AdminDirectory.Users.get(userEmail, { viewType: 'admin_view' }).isAdmin; | |
} catch {} | |
return isAdmin; | |
} | |
// Does nothing (when invoked from a dummy menu command) | |
function doNothing() { | |
SpreadsheetApp.getUi().alert(`No, you shouldn't, right?`); | |
} | |
// Actual script's code comes in here... | |
function run() { | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment