У меня есть код, который делает то, что я хочу, но у меня есть одна проблема. По сути, приведенный ниже код создает защищенный диапазон, когда ячейка в столбце AC не пуста, и удаляет ее, когда она пуста. Код работает при редактировании.
Он работает хорошо, но проблема в том, что даже если строка защищена, каждый может ее редактировать, и я понятия не имею, как ее отключить. Есть ли у кого-нибудь идеи, что может быть не так с моим кодом?
function CellProtection2(e) {
var sheet = e.source.getActiveSheet();
var range = e.range;
var row = range.getRow();
var column = range.getColumn();
// Check if the edited cell is in column AC
if (column == 29) { // Assuming AC is the 29th column
var cellValue = range.getValue();
// Get the range from column B to W for the edited row
var rowRange = sheet.getRange(row, 2, 1, 23); // B2:W2 for the first row
if (cellValue !== "") {
// If AC column is not empty, protect the range from B to W in the row
var protection = rowRange.protect().setDescription('Protected because AC column has a value');
// Remove all editors
var editors = protection.getEditors();
for (var i = 0; i < editors.length; i++) {
protection.removeEditor(editors[i]);
}
// Disable domain editing
if (protection.canDomainEdit()) {
protection.setDomainEdit(false);
}
} else {
// If AC column is empty, remove protection from the range
var protections = sheet.getProtections(SpreadsheetApp.ProtectionType.RANGE);
for (var i = 0; i < protections.length; i++) {
var protectionRange = protections[i].getRange();
if (protectionRange && protectionRange.getA1Notation() == rowRange.getA1Notation()) {
protections[i].remove();
}
}
}
}
}
«Код работает при редактировании». Пожалуйста, уточните: эта функция вызывается простым триггером или устанавливаемым триггером? Кто создал устанавливаемый триггер? Если вы используете устанавливаемый триггер, как вы гарантируете, что только один пользователь создаст устанавливаемый триггер?
только когда владелец электронной таблицы введет что-то в столбец AC, это нельзя будет редактировать, но если это сделает любой другой пользователь, тогда можно будет редактировать
@Wicket вызывается простым триггером «функция onEdit(e)»
@Timonek Когда я увидел ваш скрипт, я подумал, что функция CellProtection2 was installed as the installable OnEdit trigger. But, from it вызывается простым триггером 'function onEdit(e)', if you call the function CellProtection2` из function onEdit(e), это и есть причина вашей текущей проблемы. Пожалуйста, переименуйте onEdit в installedOnEdit, установите триггер OnEdit в installedOnEdit и проверьте его еще раз. Я думаю, что, конечно, можно напрямую использовать CellProtection2. Но я не могу знать весь ваш сценарий. Итак, я предложил вышеописанное.
@Tanaike Я попробовал, но все равно не работает...
Спасибо за ответ. По поводу @Tanaike I have tried it and it still not working..., в этом случае требуется правильно воспроизвести вашу ситуацию. Потому что, когда я тестировал ваш сценарий, я не смог воспроизвести вашу проблему, упомянутую в моем первом комментарии. Я прошу прощения за это. Но мне бы хотелось вас поддержать. Итак, можете ли вы предоставить подробный порядок действий для правильного воспроизведения вашей текущей проблемы? Этим я хотел бы это подтвердить.
@Tanaike Думаю, я получил ответ на этот вопрос. На панели действий только люди, находящиеся на вкладке «Совместный доступ», могут использовать ее и фактически защищать диапазон. Люди, находящиеся на вкладке «Просмотрщики», даже если введут что-то в столбец AC и создадут защищенный диапазон, каждый сможет это изменить.





В Google Таблицах невозможно применить защиту, блокирующую всех пользователей, поскольку владелец таблицы всегда сможет редактировать любой защищенный лист или диапазон.
При использовании сценария для создания, обновления или удаления средств защиты, чтобы заблокировать всех пользователей, кроме владельца электронной таблицы, убедитесь, что сценарий запускается владельцем электронной таблицы или устанавливаемым триггером, созданным владельцем электронной таблицы.
Если проект Google Apps Script содержится в электронной таблице, которую необходимо защитить, то проще создать триггер «вручную», а не с помощью кода с помощью веб-приложения Google Apps Script. Подробности можно найти на странице https://developers.google.com/apps-script/guides/triggers/installable.
Убедитесь, что функция, вызываемая устанавливаемым триггером, не вызывается дважды одним и тем же событием, т. е. это может произойти при использовании простого триггера и устанавливаемого триггера для одного и того же события, например, при редактировании.
Если вы создаете устанавливаемый триггер с помощью кода, убедитесь, что для каждой функции используется только один триггер.
Что касается
the problem is that even if the row is protected everyone can still edit the row, если ваша функцияCellProtection2установлена в качестве триггера OnEdit, например, при редактировании ячейки «AC2» ячейки «B2:X2» защищаются. И эти ячейки не может редактировать только владелец электронной таблицы. Другие пользователи не могут редактировать ячейки. Могу ли я спросить вас о связи между этой ситуацией и вашей текущей проблемой?