【问题标题】:Google Sheets - Data validation from a horizontal rangeGoogle 表格 - 水平范围内的数据验证
【发布时间】:2020-09-12 09:42:17
【问题描述】:

我正在尝试做一些看起来很简单的事情。在单元格 (D15) 验证规则中,我想选择 List from a range 并指定一个水平范围,而不是垂直范围。请参阅以下不言自明的屏幕截图。

但是,这不起作用。下拉列表仅显示给定范围的第一列中的数据。请参阅下面的屏幕截图。

我怎样才能做到这一点?我希望在下拉列表中看到 - Cat、Mouse、Lion 和 Deer。

PS:垂直排列列表中我想要的项目不是一种选择。

解决方案 原则上与@Marios 接受的答案相似,我为我的确切用例here 找到了解决方案。不幸的是,AppScript 似乎是唯一的答案。

【问题讨论】:

  • 这里似乎工作正常。尝试清除缓存。关闭和打开
  • @TheMaster 真的吗?您是否看到使用水平范围指定的下拉列表中的所有项目?
  • @TheMaster 我想你可能已经指定了一个封闭范围,例如E15:H15。我发现它适用于封闭范围,但不适用于 E15:15 这样的开放范围。
  • 是的。弄清楚了。这是一个错误,而不是其他任何东西。

标签: google-apps-script google-sheets google-sheets-formula


【解决方案1】:

这似乎是桌面网络应用程序中的一个错误:

  • 范围的水平范围或垂直方向不是问题
  • 但是,当使用水平范围时,数据验证范围不接受封闭式 (F3) 和开放式 (3) 范围 (F3:3)。如果两端都是
    • 打开,3:3:数据校验成功
    • 关闭,F3:M3:数据校验成功
    • 一侧打开,一侧关闭:F3:3。这实际上应该计算 lastColumn 并相应地输入范围。但是,数据验证输入对话框会删除开放端并将输入保存为 F3。如您的问题所示,这会导致只有一个单元格下拉。
  • 如果您能够绕过数据验证的模式对话框并以某种方式强制F3:3 进入数据验证配置(例如通过官方移动应用程序或脚本),则数据验证设置正确。
  • 考虑使用“帮助”>“改进帮助表”将反馈连同这篇文章一起发送给 Google。

【讨论】:

  • 我已经报告了您帖子的问题。
【解决方案2】:

替代方案:

下面的Google Apps Script解决方案怎么样。

以下代码将在单元格 D15 中创建数据验证,数据验证值由 E15:H15 范围给出:

function setDataValidation() {

const ss = SpreadsheetApp.getActive();
const sh = ss.getActiveSheet();
var cell = sh.getRange('D15'); // data validation cell
var range = sh.getRange('E15:H15'); // range of options
var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
cell.setDataValidation(rule);
}

说明:

  1. 点击工具 => 脚本编辑器

  1. 复制粘贴上述代码sn-p到脚本编辑器中,点击运行(播放按钮):


进一步的想法:

  • 无需从脚本编辑器执行函数,您可以 在 google 表格 UI 中创建一个按钮来为您执行此功能。
  • 另一种方法是让用户选择他想要的列表范围作为数据验证单元格的值,然后单击按钮自动为他创建一个数据验证单元格。
  • 您还可以创建触发器以在编辑某些内容时创建数据验证单元格。
  • 您可以为一系列单元格等创建数据验证,而不是只为一个单元格创建数据验证。

参考资料:

【讨论】:

  • 哎哟!我希望答案不会涉及 AppScript。我真的很想知道为什么看似简单的事情是不可能的。
  • 如果我没有得到直接(非 AppScript)解决方案,我会把它给你。
  • @CodePoet 我希望你能找到你需要的东西。我刚刚添加了一种方法作为 B 计划 :)
  • 一般经验法则:如果无法通过 UI 手动完成,则无法通过应用程序脚本完成。 这里显示它通过应用程序脚本工作.然后反过来必须成立:它也可以通过 UI 完成。 cc @CodePoet
  • @TheMaster TBH 我在发布答案之前尝试了 OP 的方法,但当我选择整行时它也对我不起作用。
【解决方案3】:

我了解您希望水平显示这些值,因此无法在该表中垂直排列它们,但您可以在其他地方这样做吗?

在这种情况下,我更喜欢至少有一张可以列出输入值的工作表——让我们称该工作表为“INPUTS”。在每一列中,我可以手动列出值或使用一些公式手动填充它(例如=TRANSPOSE('Dynamic Brands'!E15:15))。现在我可以在数据验证中使用这个新范围了。

或者,您可以使用行数据构建数据验证,但没有“在单元格中显示下拉列表”功能。将您的条件更改为自定义公式并使用此公式=ISNUMBER(MATCH('Dynamic Brands'!D15, 'Dynamic Brands'!E15:15, 0))

【讨论】:

  • 问题是,这是一个动态下拉菜单。它显示的内容取决于在另一个带有下拉列表的单元格中选择的值。因此,它的内容需要使用INDIRECTFILTER等函数动态确定。即使我使用另一张纸并垂直排列内容,也必须使用简单的计算来确定特定行要使用的列。不幸的是,“范围列表”需要硬编码范围,它不接受可能使用公式确定的计算范围。其中,存在主要问题。我不确定我是否足够清楚。
  • 我喜欢使用公式想法的建议验证。但是,这会让我的目标受众难以使用该表格。
  • @CodePoet 听起来像是问题的另一个维度。验证确实接受其值被计算的范围,但范围地址确实必须是硬编码的。这意味着每个下拉单元格都需要一个新的数据验证规则。鉴于电子表格的限制,我会重新考虑预期的设计......或使用应用程序脚本。
  • 是的,确实如此。实际的问题是另外一回事。我找到了一个解决方案,但由于我无法指定水平(开放)范围,所以它崩溃了。我在这里找到了我的确切用例和解决方案:support.google.com/docs/thread/6735222?msgid=6773038
【解决方案4】:

如果您的列范围不是动态选择列的结束范围以及行,即使用给定的示例,而不是将范围插入为E15:15,将范围设置为E15:H15,这将在下拉列表中填充您的所有范围

【讨论】:

  • 不幸的是,范围需要是动态的。在给定的行中,可以有从列E 开始的任意数量的列。每行的列数也会有所不同。当然,我可能会使用一个巨大的数字,比如 1000 来解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2020-12-07
  • 2023-02-21
  • 1970-01-01
  • 2021-09-09
  • 2021-11-26
  • 1970-01-01
相关资源
最近更新 更多