我在Google电子表格上使用数据验证规则。
在我的场景中,我需要用户只输入有效值。我使用'拒绝输入'强制他们只编写经过验证的内容。
但是,“拒绝输入”选项仅适用于手动编辑的数据,但如果用户将内容从其他来源(例如MS Excel文档)粘贴到单元格中,则不会起作用。在这种情况下,仍会显示警告但写入无效值。
换句话说,我需要“拒绝输入”选项才能使用粘贴的内容。 或者......另一种方法是根据该单元格的Datavalidation规则以编程方式检查值的有效性。
有什么想法吗?
提前谢谢。
答案 0 :(得分:1)
我对此有点玩耍。
我的谷歌行为不一致。 有时当我按ctrl-c和ctrl-p时,目标单元格失去了数据验证!
以编程方式执行此操作
使用以下方法收集参数
var sheet = e.source.getActiveSheet();
var sheetname = sheet.getSheetName();
var a_range = sheet.getActiveRange();
var activecell = e.source.getActiveCell();
var col = activecell.getColumn();
var row = activecell.getRow();
您可能希望检查a_range以确保它们没有复制和粘贴多个单元格。
查看编辑是否发生在您已验证数据的区域;
if (sheetname == "mySheet") {
// checking they have not just cleared the cell
if (col == # && activecell.getValue() != "") {
THIS IS WHERE YOU CHECK THE activecell.getValue() AGAINST YOUR DATA VALIDATION
AND USE
activecell.setValue("") ;
to clear the cell if you want to reject the value
}
}
这个问题的一个明显问题是它本质上是以编程方式重复数据验证应该已经做的事情。
因此,您必须保持两组验证规则同步。您可以删除表单数据验证,但我发现这对提供用户反馈很有用。您正在使用的数据验证也提供了实用的内容。
如果有一种方法可以检测到ctrl-p已被使用或其中一个粘贴特殊选项并且只在这些情况下运行脚本,那将会很棒。我真的很想知道答案。找不到任何可以帮到你的东西。
另请注意,如果有人插入一行,则不会触发任何数据验证,onEdit()触发器也不会检测到它。它仅在编辑工作表时有效,我认为这意味着内容发生了变化。 onChange()应该检测插入,它被描述为;
指定在电子表格的内容或时触发的触发器 结构改变了。
答案 1 :(得分:1)
我发布了另一个答案,因为这是一个程序化解决方案。
它有很多问题并且速度很慢但是我正在演示这个过程而不是代码的效率。
很慢。可以使这种运行更快。
它假设粘贴了一个单元格。
它不适合插入行或列。
onEdit(event)具有可访问的某些属性。我无法确定我是否有完整的列表,我将不胜感激。查看电子表格编辑事件部分here。
感兴趣的财产是" e.value"。
我注意到如果你输入一个单元格e.value ="值类型"但如果你粘贴或粘贴 - >特殊,那么e.value = undefined。如果删除单元格内容也是如此,我不确定其他情况。
这是一个电子表格和脚本,用于检测用户是否已键入,粘贴或删除到特定单元格中。它还检测用户从数据验证中选择。
键入,粘贴或删除黄金单元格C3或选择下拉绿色单元格C4。
如果您不能等待复制和放弃,则需要申请访问权限。粘贴代码,设置触发器并使用它。
设置触发器onEdit()以调用它或将其重命名为onEdit(event)
您可以将其附加到空白表格,它将写入单元格(5,3)和(6,3)。
function detectPaste(event) {
var sheet = event.source.getActiveSheet();
var input_type =" ";
if (event.value == undefined) { // paste has occured
var activecell = event.source.getActiveCell();
if (activecell.getValue() == "") { // either delete or paste of empty cell
sheet.getRange(5,3).setValue("What a good User you are!");
sheet.getRange(6,3).setValue(event.value);
input_type = "delete"
}
else {
activecell.setValue("");
sheet.getRange(5,3).setValue("You pasted so I removed it");
sheet.getRange(6,3).setValue(event.value);
input_type = "paste";
}
}
else { // valid input
sheet.getRange(5,3).setValue("What a good User you are!");
sheet.getRange(6,3).setValue(event.value);
input_type = "type or select";
}
SpreadsheetApp.getActiveSpreadsheet().toast('Input type = ' + input_type, 'User Input detected ', 3);
}