Google Sheet защищает диапазон и снимает защиту

#google-sheets

#google-sheets

Вопрос:

Я использую следующий код для защиты диапазона из таблицы Google

 // 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 throws an exception upon removing the group.
var me = Session.getEffectiveUser();
protection.addEditor("*my email account*");
protection.removeEditors(protection.getEditors());
if (protection.canDomainEdit()) {
  protection.setDomainEdit(false);
}
 

где моя учетная запись электронной почты — это учетная запись Google.

Затем я делюсь листом с некоторыми другими людьми, с которыми я хочу иметь возможность снимать защиту, если им нужно, запустив скрипт, запускаемый щелчком по значку. Код включает

 // 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();
  }
}
 

Согласно документации, приведенный выше код должен удалить защиту. Но это не работает. Что не так?

Спасибо!

Комментарии:

1. Для меня это удаляет защищенные диапазоны. Вы уверены, что это не работает?

2. ДА. Когда вы снимаете защиту, делаете ли вы это с другой учетной записью по сравнению с той, которую вы использовали для защиты диапазона? Спасибо

Ответ №1:

Факты:

  • Вы создали документ, который делает вас владельцем.
  • Вы создали защиту для диапазона, что делает вас единственным лицом, которому разрешено изменять этот диапазон или эту защиту.

Необходимые шаги:

  1. Сделайте приглашенного пользователя редактором вашей защиты, чтобы он мог ее удалить. Использование protection.addEditor("example.editor@domain.com")
  2. Теперь «example.editor@domain.com » могу снять добавленную вами защиту.
  3. «example.editor@domain.com » может создать новую защиту и не требует добавлять вас (владельца документа) в качестве редактора к защите. По умолчанию вы являетесь редактором всех защит.

Пример:

Когда владелец изначально создает защиту, он должен добавить того, кого он хочет, чтобы иметь возможность редактировать защищенный диапазон и защиту в качестве редактора самой защиты. итак, вы бы использовали функцию example protectRangeAddingEditor() .

Затем, если вы не хотите делиться этой функцией с редакторами, после создания защиты удалите ее из скрипта. И оставьте только removeProtection() amp; protectRange() для их использования.

 function protectRangeAddingEditor() {
  // Protect range A1:B10, then remove all other users from the list of editors.
  var ss = SpreadsheetApp.getActive();
  var range = ss.getRange('A1:B10');
  try {
    // Create the protection (you are owner of the document amp; the protection since you created it)
    var protection = range.protect().setDescription('Sample protected range');
    // Add editors to your protection
    var editor = "example.editor@domain.com"
    protection.addEditor(editor);

    protection.setDomainEdit(false);

  }
  catch (error) {
    console.log(JSON.stringify(error))
  }
}

function removeProtection() {
  // 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();
    }
  }
}

function protectRange() {
  // Protect range A1:B10, then remove all other users from the list of editors.
  var ss = SpreadsheetApp.getActive();
  var range = ss.getRange('A1:B10');
  try {
    // Create the protection (you are owner of the document amp; the protection since you created it)
    var protection = range.protect().setDescription('Sample protected range');
    protection.setDomainEdit(false);

  }
  catch (error) {
    console.log(JSON.stringify(error))
  }
}