谷歌表格-只读栏,我也可以复制



我有一个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();
}
}
}

注:

  • 请确保根据您的偏好修改EDITORSSHEET_NAME

相关内容

最新更新