在数据验证规则

时间:2017-10-26 12:09:19

标签: google-apps-script google-sheets

我有一个工作的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提到的版本(我已经将答案归于其中),但我认为如果上面的表格不可用,我会记录我的解决方案,或者您无法访问它,或者您只是想要更多细节。

所以,对于我的演示,我有这个:

setup of sheet

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万个单元格限制。

希望这有助于某人。

2 个答案:

答案 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, " ", "")))将其复制到您需要的位置。

在这一点上,值得注意的是,因为我们正在使用内置函数,所以速度要好得多,我的例子就可以看出。

现在痛苦的一点。对于我的示例中的每个子类别单元格(C8C9等),您需要独立添加验证作为E8:ZZ8的范围(显然ZZ8需要稍微统治)和{{它似乎没有参考,所以如果您选择列中的所有单元格,它们只会查看您在框中专门输入的数据...我可能还没有找到R1C1但是,这里的符号。我试过了。

可以在GAS上编写脚本以创建R1C1验证功能,然后将其应用于范围。