Javascript 在Google表单中输入数据后自动保护单元格/区域

Javascript 在Google表单中输入数据后自动保护单元格/区域,javascript,google-apps-script,google-sheets,Javascript,Google Apps Script,Google Sheets,我有一个公共电子表格,人们可以在“姓名”栏下输入自己的姓名。除“名称”列中的单元格外,此表中的所有内容均受保护。由于电子表格是公开的,我想避免出现这样一种情况,即有人可以控制并删除所有已输入的名称。因此,我正在尝试使用on edit触发器设置一个脚本,以便在任何人在单元格中输入姓名后保护该范围内的单元格。到目前为止,我一直在输入名称后手动保护单元格 我发现最好的方法是使用on-edit触发器。我以前使用过javascript,但由于我是谷歌电子表格scrips的新手,我无法让我的脚本按预期运行。

我有一个公共电子表格,人们可以在“姓名”栏下输入自己的姓名。除“名称”列中的单元格外,此表中的所有内容均受保护。由于电子表格是公开的,我想避免出现这样一种情况,即有人可以控制并删除所有已输入的名称。因此,我正在尝试使用on edit触发器设置一个脚本,以便在任何人在单元格中输入姓名后保护该范围内的单元格。到目前为止,我一直在输入名称后手动保护单元格

我发现最好的方法是使用on-edit触发器。我以前使用过javascript,但由于我是谷歌电子表格scrips的新手,我无法让我的脚本按预期运行。当前脚本应该在编辑时自动保护范围,并添加保护完成时间的说明。 此处包含脚本的电子表格示例:

参考:

讨论中的数据范围是A2:A1000,目前它似乎部分工作,但是,它在编辑单个单元格后保护整个范围,而不是像预期的那样仅保护已编辑的单元格


为了让脚本单独锁定单元格而不是整个范围,是否缺少任何步骤?非常感谢您的任何见解

我做了一些更正:

function protectOnEdit(e) {
  var range = e.range;
  // Be sure to have edited the sheet "Sheet1"
  if (range.getSheet().getName() != "Sheet1") return;
  // Be sure to have a single cell as edited range
  if (range.getWidth() != 1 || range.getHeight() != 1) return;
  // Be sure to have edited cell inside A2:A1000
  if (range.getColumn() != 1 || range.getRow() < 2) return;
  // Be sure to have non-blank new value
  if (!e.value) return;

  // Protect this range
  var timeZone = Session.getScriptTimeZone();
  var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
  var description = 'Protected on ' + stringDate;
  var protection = range.protect().setDescription(description);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) protection.setDomainEdit(false);
}
功能保护编辑(e){
var范围=e范围;
//确保已编辑工作表“Sheet1”
如果(range.getSheet().getName()!=“Sheet1”)返回;
//确保将单个单元格作为编辑区域
如果(range.getWidth()!=1 | | range.getHeight()!=1)返回;
//确保已编辑A2:A1000内的单元格
if(range.getColumn()!=1 | | range.getRow()<2)返回;
//确保具有非空的新值
如果(!e.value)返回;
//保护这个范围
var timeZone=Session.getScriptTimeZone();
var stringDate=Utilities.formatDate(新日期(),时区'dd/MM/yy HH:MM');
变量说明='在'+stringDate'受保护;
var protection=range.protect().setDescription(说明);
protection.removeditors(protection.getEditors());
if(protection.canDomainEdit())protection.setDomainEdit(false);
}
首先,脚本检查几个条件以获得所需的保护。在我看来,他们对这项任务很重要。如果所有这些都是真的,则保护单个细胞。电子表格所有者没有编辑受保护单元格的限制,但其他编辑器有


当然,所有者应该正确安装此功能的触发器,以自动执行此过程。

我已经做了一些更正:

function protectOnEdit(e) {
  var range = e.range;
  // Be sure to have edited the sheet "Sheet1"
  if (range.getSheet().getName() != "Sheet1") return;
  // Be sure to have a single cell as edited range
  if (range.getWidth() != 1 || range.getHeight() != 1) return;
  // Be sure to have edited cell inside A2:A1000
  if (range.getColumn() != 1 || range.getRow() < 2) return;
  // Be sure to have non-blank new value
  if (!e.value) return;

  // Protect this range
  var timeZone = Session.getScriptTimeZone();
  var stringDate = Utilities.formatDate(new Date(), timeZone, 'dd/MM/yy HH:mm');
  var description = 'Protected on ' + stringDate;
  var protection = range.protect().setDescription(description);
  protection.removeEditors(protection.getEditors());
  if (protection.canDomainEdit()) protection.setDomainEdit(false);
}
功能保护编辑(e){
var范围=e范围;
//确保已编辑工作表“Sheet1”
如果(range.getSheet().getName()!=“Sheet1”)返回;
//确保将单个单元格作为编辑区域
如果(range.getWidth()!=1 | | range.getHeight()!=1)返回;
//确保已编辑A2:A1000内的单元格
if(range.getColumn()!=1 | | range.getRow()<2)返回;
//确保具有非空的新值
如果(!e.value)返回;
//保护这个范围
var timeZone=Session.getScriptTimeZone();
var stringDate=Utilities.formatDate(新日期(),时区'dd/MM/yy HH:MM');
变量说明='在'+stringDate'受保护;
var protection=range.protect().setDescription(说明);
protection.removeditors(protection.getEditors());
if(protection.canDomainEdit())protection.setDomainEdit(false);
}
首先,脚本检查几个条件以获得所需的保护。在我看来,他们对这项任务很重要。如果所有这些都是真的,则保护单个细胞。电子表格所有者没有编辑受保护单元格的限制,但其他编辑器有

当然,所有者应该为该功能正确安装触发器,以自动执行该过程。

请参阅我的答案()。我认为它提供了你需要的99%的信息。请参考我的答案()。我认为它提供了你需要的99%的信息。