如何拒绝对查询生成的非空单元格的更改



用来自单独工作簿的查询结果填充的工作表。用户可以从下拉菜单中选择任何单元格的值。当onEdit调用时,值被转移到主工作簿,然后通过查询将其复制回活动工作表中的当前单元格。试图阻止具有现有值的单元格被编辑-即用户只能在当前空白单元格中添加值,而不能更改现有的。因为查询会随着主数据库中的每次更改而重新填充,所以空单元格的位置会随着填充或在主数据库中添加新行而不断变化。

(下面的代码是从这个视频和一个类似的唯一ID的混搭…(https://www.youtube.com/watch?v=ucLO4iHP2Kw))

尝试将当前数据范围读入数组,并在任何非空单元格上设置保护。这是有效的,但是3x60的单元格需要超过2分钟才能在非空白上设置保护。在用户可以继续编辑另一个单元格之前,等待时间不是很长!

下面是onEdit()触发的当前代码"else"后面的部分是我想通过拒绝用户选择/输入来保释的地方。

任何尝试输入不同的内容或更改非空单元格中的值都会导致查询生成错误,因为它不想覆盖该单元格。打"德尔塔"键清除单元格,然后查询将刷新所有内容。最理想的情况是,在"else"之后的部分是最好的。只是做了同样的事——按"Del"钥匙!

function syncData(e){
var src = e.source.getActiveSheet();
var r = e.range;
if (e.oldValue == null){
r.clear();
let id = src.getRange(r.rowStart,1).getValue();
var db = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("SHEET NAME");
var ids = db.getRange("A:A").getValues();
let row = 0;
for (row; row < ids.length; row++){
if (ids[row][0] === id)
break;
}
row++;
db.getRange(row,r.columnStart).setValue(e.value);
}
else{
e.setValue(e.oldValue);
}
} 

当然,我在这里发帖后找到了解决方案!如果剩下的工作,我所需要做的就是将e.o oldvalue发布到主电子表格中,而不是e.o value。这将用原始值重新填充视图表,从而阻止用户进行更改。

修改后的代码:

function NewsyncData(e){
var src = e.source.getActiveSheet();
var r = e.range;
r.clear();
let id = src.getRange(r.rowStart,1).getValue();
var db = SpreadsheetApp.openById("SPREADSHEET ID").getSheetByName("SHEET NAMES");
var ids = db.getRange("A:A").getValues();
let row = 0;
for (row; row < ids.length; row++){
if (ids[row][0] === id)
break;
}
row++;
if (e.oldValue == null){
db.getRange(row,r.columnStart).setValue(e.value);
}
else{
db.getRange(row,r.columnStart).setValue(e.oldValue);
} 
}

最新更新