我有一个Google Sheet,我为一些可以编辑数据的人授予了编辑权限。在这张表中,我有一列(B列,WEEKDAY(,我想根据同一行的另一列(a列,包含日期值(的值将其显示为只读值。例如如果列A的值是2022年2月14日;星期一";在B栏上。为了防止编辑器出错,我使用保护范围功能将列B设置为只读。但是,我的问题是,一旦我设置了这种保护,他们就不能将整行复制到另一行,也不能删除整行,因为B列是受保护的。解决我的需求的正确方法是什么?对我来说,使用Apps脚本也是可能的。同时,我将保护范围从错误更改为警告,因为我目前没有更好的解决方案。
我在单元格B1中使用ARRAYFORMULA,但用户可以忽略它,并手动覆盖B7的值(例如(,而不是公式值。如果他们进行这样的手动超控;数组结果没有展开,因为它将覆盖B7中的数据;。这就是我希望将列B设置为只读的原因,这样用户就不能手动覆盖公式值。
问题:
- 您在
B1
上使用ARRAYFORMULA,它填充了B列中的几个单元格 - 您希望用户能够复制和删除行
- 您希望用户不能编辑列
B
中的值(因为这会扰乱ARRAYFORMULA
(
解决方案:
使用onEdit触发器,每次用户编辑电子表格单元格时执行以下操作:
- 使用Session.getActiveUser((检查用户是否有权编辑列B(拥有权限的用户列表在脚本中定义,很可能为空(
- 如果用户有权限,请使用事件对象检查编辑的单元格是否在受保护范围(
B2:B
(内 - 如果编辑的单元格在该范围内,请使用range.clearContent((删除该范围内的任何值
关于包含公式的单元格B1
,我会通过Sheets编辑器(ref(对其进行常规保护。
代码示例:
const EDITORS = ["your_editor@domain.com"]; // Users who can edit column B
const SHEET_NAME = "Sheet1"; // Change accordingly
const PROTECTED_COL = 2; // Column B
const FIRST_ROW = 2; // Header row is protected conventionally
function onEdit(e) {
const userEmail = Session.getActiveUser().getEmail();
if (!EDITORS.includes(userEmail)) {
const range = e.range;
const sheet = range.getSheet();
if (sheet.getName() === SHEET_NAME && range.getColumn() === PROTECTED_COL && range.getRow() >= FIRST_ROW) {
sheet.getRange(FIRST_ROW, PROTECTED_COL, sheet.getLastRow()-FIRST_ROW+1).clearContent();
}
}
}
注:
- 请确保根据您的偏好修改
EDITORS
和SHEET_NAME