I am trying to automate the process of updating sharing permissions of a google drive folder based on email addresses stored in a google sheets document.
Sheet named 'Sharing_Opt' has 2 columns, A and B.
Col A contains the addresses that should be viewers, and Col B dwellers should be editors. If an email is present in both columns it should be counted as B thus editor.
If somebody has the folder shared with them who are not in this list of emails, they should have their access revoked.
There are also exceptions, that are always editor, and not touched by the code even if they are not found in the list.
If somebody has the wrong permission (ie.: they have editor permission, but are not found in either exceptions, or col B, they should be demoted to viewers, and vice versa).
There may also be blank cells containing nothing between emails, the script should skip those.
Also when run, it should log changes it did with the date into a log file for later inspection.
Also the code shouldn't touch people that are present in their 'rightful' place, so no remove everything and add again approach is preferred.
Also people who are shared a folder currently get emails that a folder has been shared with them, I want no emails, notifications, just run it in the background and that's it. All info I need should be in the log.
This is my code right now, it doesn't rly do what I need, and I'm completely stuck where it all went wrong.
I have 2 approaches, both of them work kinda, but are not perfect so I can't use any of them right now.
Code 1:
function updateAccess11() {
var folderId = "FOLDER_ID";
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName("Sharing_Opt");
var viewEmails = sheet.getRange("A2:A").getValues().flat().filter(Boolean);
var editEmails = sheet.getRange("B2:B").getValues().flat().filter(Boolean);
var folder = DriveApp.getFolderById(folderId);
var viewers = folder.getViewers();
var editors = folder.getEditors();
var excludeEmails = ["excep1@gmail.com", "pleasehelpme@gmail.com", "iamtotallystuck@gmail.com"]; // List of emails to always exclude
var currentEmails = viewers.concat(editors).map(function(user) {
return user.getEmail();
});
var removeEmails = currentEmails.filter(function(email) {
return !excludeEmails.includes(email) && !viewEmails.includes(email) && !editEmails.includes(email);
});
Logger.log("new Viewers: " + viewEmails.filter(function(email) { return !currentEmails.includes(email); }));
Logger.log("new Editors: " + editEmails.filter(function(email) { return !currentEmails.includes(email); }));
Logger.log("remove Emails: " + removeEmails);
var dir = DriveApp.getFolderById("FOLDER_ID");
var logFileName = "AccessLog" + ".txt";
var logFile = DriveApp.getFileById("LOG_FILE_ID")
var logFileId = logFile.getId();
var logFile = DriveApp.getFileById(logFileId);
var log = "Log Results:\n\n" + "new Viewers: " + viewEmails.filter(function(email) { return !currentEmails.includes(email); }) + "\n\n" + "new Editors: " + editEmails.filter(function(email) { return !currentEmails.includes(email); }) + "\n\n" + "removed Emails: " + removeEmails;
var currentContent = logFile.getBlob().getDataAsString();
var date = new Date().toLocaleString();
var newContent = "--------" + date + "--------" + "\n\n" + log + "\n\n" + currentContent;
logFile.setContent(newContent);
removeEmails.forEach(function(email) {
var user = editors.find(function(editor) {
return editor.getEmail() === email;
});
if (user) {
folder.removeEditor(user);
} else {
user = viewers.find(function(viewer) {
return viewer.getEmail() === email;
});
if (user) {
folder.removeViewer(user);
}
}
});
viewEmails.filter(function(email) {
return currentEmails.includes(email);
}).forEach(function(email) {
folder.removeEditor(editors.find(function(editor) {
return editor.getEmail() === email;
}));
folder.removeViewer(viewers.find(function(viewer) {
return viewer.getEmail() === email;
}));
});
// Add emails to roles
viewEmails.filter(function(email) {
return !currentEmails.includes(email);
}).forEach(function(email) {
folder.addViewer(email);
});
editEmails.filter(function(email) {
return !currentEmails.includes(email) && !viewEmails.includes(email);
}).forEach(function(email) {
folder.addEditor(email);
});
// Remove emails from conflicting roles
viewEmails.filter(function(email) {
return currentEmails.includes(email) && editEmails.includes(email);
}).forEach(function(email) {
folder.removeEditor(editors.find(function(editor) {
return editor.getEmail() === email;
}));
});
viewEmails.filter(function(email) {
return !currentEmails.includes(email);
}).forEach(function(email) {
folder.addViewer(email);
});
editEmails.filter(function(email) {
return !currentEmails.includes(email);
}).forEach(function(email) {
folder.addEditor(email);
});
}
Code 2:
function updatePermissions() {
var sheet = SpreadsheetApp.getActiveSheet();
var sharingOptSheet = SpreadsheetApp.getActive().getSheetByName("Sharing_Opt");
var colA = sharingOptSheet.getRange("A2:A").getValues();
var colB = sharingOptSheet.getRange("B2:B").getValues();
var folder = DriveApp.getFolderById("FOLDER_ID");
var users = folder.getEditors().concat(folder.getViewers());
DriveApp.getRootFolder().removeNotificationEmails();
var emails = {};
for (var i = 0; i < colA.length; i++) {
if (colA[i][0]) {
emails[colA[i][0]] = "viewer";
}
}
for (var i = 0; i < colB.length; i++) {
if (colB[i][0]) {
emails[colB[i][0]] = "editor";
}
}
var exceptions = ["helpmeplease@gmail.com", "<3@gmail.com", "iamsoclose@gmail.com"];
var currentUserEmail = Session.getEffectiveUser().getEmail();
for (var email in emails) {
var role = emails[email];
if (!emails.hasOwnProperty(email)) continue;
if (email === currentUserEmail || exceptions.indexOf(email) !== -1) continue;
try {
if (role === "editor") {
folder.addEditor(email);
DriveApp.getFileById(folder.getId()).setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.NONE);
Logger.log(email + " was added as editor.");
} else {
folder.addViewer(email);
DriveApp.getFileById(folder.getId()).setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.NONE);
Logger.log(email + " was added as viewer.");
}
} catch (error) {
Logger.log("Error: " + error + " for email: " + email);
}
}
for (var i = 0; i < users.length; i++) {
var email = users[i].getEmail();
var role = emails[email] || "viewer";
if (!emails.hasOwnProperty(email) && exceptions.indexOf(email) === -1) {
folder.removeEditor(users[i]);
DriveApp.getFileById(folder.getId()).setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.NONE);
Logger.log(email + " was removed from the folder.");
} else if (role === "editor" && folder.getEditors().indexOf(users[i]) === -1) {
folder.addEditor(users[i]);
DriveApp.getFileById(folder.getId()).setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.NONE);
Logger.log(email + " was promoted to editor.");
} else if (role === "viewer" && folder.getEditors().indexOf(users[i]) !== -1) {
folder.removeEditor(users[i]);
DriveApp.getFileById(folder.getId()).setSharing(DriveApp.Access.DOMAIN, DriveApp.Permission.NONE);
Logger.log(email + " was demoted to viewer.");
} else {
Logger.log(email + " has the correct role of " + role + ".");
}
}
Logger.log("Exceptions: " + exceptions.join(", "));
}
thanks for you insight and help <3!