Control protected ranges and sheets in Google Sheets with Apps Script
A few weeks ago, the Google Sheets team
introduced
improved
control over protected sheets and ranges. Developers have told us they're looking
for the same power in Google Apps Script — after all, ever since
we
added data validation to the Spreadsheet service, programmatic
control
over protected ranges has been the most popular request on the
Apps Script issue
tracker.
Today, we are excited to give you that granular control.
With the new
Protection
class in the Spreadsheet service, your scripts can touch every aspect of range or sheet
protection, just like in the new UI. (The older
PageProtection
class, which had more limited features, will be deprecated, but will stick around in case you
need to work with older spreadsheets. The new Protection class only applies to the newer
version of Sheets.)
Code samples
So let's see the new stuff in action. Let's say you want to prohibit anyone other than
yourself from editing cells A1:B10:
// Protect range A1:B10, then remove all other users from the list of
editors.
var ss = SpreadsheetApp.getActive();
var range = ss.getRange('A1:B10');
var protection = range.protect().setDescription('Sample protected range');
// Ensure the current user is an editor before removing others. Otherwise, if the user's
edit
// permission comes from a group, the script will throw an exception upon removing the
group.
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
Or maybe you want to remove all range protections in the whole spreadsheet:
// Remove all range protections in the spreadsheet that the user has permission to
edit.
var ss = SpreadsheetApp.getActive();
var protections = ss.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protection = protections[i];
if (protection.canEdit()) {
protection.remove();
}
}
Or perhaps you want to protect an entire sheet, but carve out a small hole in it — an
unprotected range within a protected sheet — that others can still edit:
// Protect the active sheet except B2:C5, then remove all other users from the
list of editors.
var sheet = SpreadsheetApp.getActiveSheet();
var protection = sheet.protect().setDescription('Sample protected sheet');
var unprotected = sheet.getRange('B2:C5');
protection.setUnprotectedRanges([unprotected]);
// Ensure the current user is an editor before removing others. Otherwise, if the user's
edit
// permission comes from a group, the script will throw an exception upon removing the
group.
var me = Session.getEffectiveUser();
protection.addEditor(me);
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
Bam! Easy. Hope you find this useful, and happy scripting!
Posted by Sam Berlin, engineer, Google Sheets