我有一个工作的Excel电子表格,在数据验证中使用了indirect()
,它工作正常。我将它上传到工作表并转换它,现在间接不起作用。
我在支持论坛上发现了a link,说明它在Chrome中不起作用但似乎可以在Firefox中运行,答案和解决方法似乎是用于生成辅助列表...这就是我想要,但在一行的数据验证中。
我已经打开了一个简单的测试表,希望公开并且脚本编辑器可见:
https://docs.google.com/spreadsheets/d/1KUgrdXKIKlk1DWvDOX9cY3B2VnRH_5h_vKuZJlqUlN8/edit?usp=sharing
希望你能看到我追求的东西。我希望C8
中的验证成为基于B8
的类别中的项目列表; C9
基于B9
等。
编辑和更新
问题是在数据验证规则中替换indirect()。虽然我确实通过使用indirect()找到了解决这个问题的方法,但我更喜欢Desire提到的版本(我已经将答案归于其中),但我认为如果上面的表格不可用,我会记录我的解决方案,或者您无法访问它,或者您只是想要更多细节。
所以,对于我的演示,我有这个:
在A1:C5
中我是带有标题的数据列表。
在B8:B12
范围内,我在A1:C1
范围内应用了值的数据验证规则 - 这是第一个下拉列表。
在单元格E8
中,我将公式=transpose(filter($A$2:$C$5, $A$1:$C$1 = B8))
放入,然后将其复制到E12
最后,我将以下内容放在一个函数中,并在脚本编辑器中运行它。
function runMeOnce() {
var dst = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange('C8:C12');
var rules = [];
for (var i = 8; i < 13; i++) {
var src = SpreadsheetApp.getActive().getSheetByName('Sheet1').getRange("E" + i + ":H" + i);
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(src).build();
rules.push(rule);
}
dst.setDataValidations(rules);
}
那就是全部,没有onEdit()
触发。
注意尽管如此,我还是遇到了一个不利因素。我在实际的电子表格中有6000多行,并且在多个工作表中有一些下拉列表有50-100个项目。这个解决方案严重影响(当前)200万个单元格限制。
希望这有助于某人。
答案 0 :(得分:1)
类型的数据验证规则&#34;项目清单&#34;仅将逗号分隔的值列表作为其参数,并且不会评估您尝试放置的任何公式。函数返回什么并不重要,因为它不会被调用。如果你说,&#34; = sqrt(A10)&#34;在字段&#34;项目列表&#34;中,这仅表示验证规则将要求字符串&#34; = sqrt(A10)&#34;进入牢房。
类似于&#34;来自范围&#34;的列表。您输入的内容将作为范围表示法解析,或者不会。字符串&#34; = getValidationRange(B8)&#34;不解析为范围表示法,因此错误。永远不会调用该函数。
调用函数的唯一验证类型是&#34;自定义公式&#34;。如果您使用它,则可以按预期执行验证:例如,
=match(C8, filter(A2:C5, A1:C1 = B8), 0)
要求C8的内容位于表A2:C5的列中与B8中的类别匹配的标题下。但是,使用自定义公式,您不会在单元格中获得下拉列表。
要获得动态下拉菜单,可以
例如,在单元格F1中输入filter(A2:C5, A1:C1 = B8)
,以便F列用于当前选定的类别。数据验证将是&#34;列表来自范围&#34;,F1:F。对于一个验证规则,这是一个很好的解决方法,但是当您有多个验证规则时需要做更多工作。
使用在编辑时触发的脚本并相应地设置数据验证规则;这在How do you do dynamic / dependent drop downs in Google Sheets?和其他地方讨论过。
答案 1 :(得分:1)
基于牺牲一个山羊问题,我找到了一个简单的(ish)方法来解决仍然使用indirect()
的问题。
使用CamelCase中的标题设置以前的命名范围。在我的例子中,我有CatA,CatB和CatC - 即需要移除空白区域。
在行的末尾(或另一张表格中)转置所选的命名范围(在单元格E8
中:=transpose(indirect(substitute(B8, " ", "")))
将其复制到您需要的位置。
在这一点上,值得注意的是,因为我们正在使用内置函数,所以速度要好得多,我的例子就可以看出。
现在痛苦的一点。对于我的示例中的每个子类别单元格(C8
,C9
等),您需要独立添加验证作为E8:ZZ8
的范围(显然ZZ8需要稍微统治)和{{它似乎没有参考,所以如果您选择列中的所有单元格,它们只会查看您在框中专门输入的数据...我可能还没有找到R1C1但是,这里的符号。我试过了。
可以在GAS上编写脚本以创建R1C1验证功能,然后将其应用于范围。