1

我创建了一个电子表格来跟踪约会。在此电子表格中,我有动态相关下拉列表,因此列表 1 中的选择将填充列表 2 中的选项。如下所示:

单元格 C2:客户端 - 客户端 1 或客户端 2。(这是用于示例的,实际列表将扩展。)

如果单元格 C2 = Client 1,则地址下拉列表如下:

单元格 C3:地址 - 地址 1 或地址 2。

如果单元格 C2 = Client 2,则地址下拉列表如下:

单元格 C3:地址 - 地址 3 或地址 4。

客户列表的数据验证很简单,因为这是恒定的并且可以从列复制到列。但是,从属地址列表的数据验证不能跨多个列复制,因为它将始终引用 C 列并失去与相关客户端列表的连接。

单元格 C3(地址列表)的实际数据验证如下:

单元格范围 = '日记 (V-2.1)'!C3

标准 = '日记 (V-2.1)'!C53:C55

单元格 C53:C55 由过滤器公式填充,该过滤器公式将根据单元格 C2 中的客户端选择对相关地址进行排序,这反过来填充 C3 中的地址列表。

可能值得注意的是,我每列有 10 组这些预约空档(每天 10 次),所以我对这些单独的预约中的每一个都使用了过滤功能,以便它们独立工作,但即使这样也很乏味,所以我需要能够从列 C 开始复制列(或只是数据验证),并使其保持相对于该列中的过滤器函数。

请参阅下面的示例电子表格链接,这一切都有意义!在示例中,我已将 C 列复制到 D 列,并且地址列表的数据验证已针对所有 10 个预约空档分离。(所有人都可以免费编辑。)

https://docs.google.com/spreadsheets/d/1sOlQEzG1D29RaY86YeR1Da--c8t94J-ZAGjv52U4dsY/edit#gid=1950191921

注意:这些单元格必须是下拉列表 - 范围列表 - 用于此特定电子表格的功能。

如果有人可以帮助解决这个问题,我将不胜感激,因为我一直在努力搜索论坛并且找不到解决方案。我确实看到了这个视频(这让我很头疼),它似乎是使用 java 脚本完成的:

https://www.youtube.com/watch?v=ZiYnuZ8MwgM&feature=youtu.be

4

2 回答 2

9

Google 表格目前没有用于复制/填充数据验证参考或公式的内置解决方案。但是有人已经在这个Google Docs 论坛帖子中写了一个很好的脚本。为避免仅将链接作为答案,我将在此处复制脚本和说明。来自 Google Docs 论坛的AD:AM 。

如何使用他们的脚本:

  1. 选择要复制数据验证规则的单元格范围,相对
  2. 从 Validation+ 自定义菜单中,选择适当的选项(所有引用相对、列绝对或行绝对)
  3. 左上角单元格的验证将被复制到范围的其余部分

链接到已包含脚本的原始解决方案示例 Google 表格- 您可以保存自己的副本,然后开始使用。

或者从头开始重新创建,这里是脚本。

function onOpen()
{
  SpreadsheetApp.getActiveSpreadsheet().addMenu
  (
    "Validation+",
    [
      {name: "Copy validation (all relative references)", functionName: "copyValidation"},
      {name: "Copy validation (relative rows, absolute columns)", functionName: "copyValidationColumnsAbsolute"},
      {name: "Copy validation (absolute rows, relative columns)", functionName: "copyValidationRowsAbsolute"}
    ]
  );
}

function copyValidation(rowsAbsolute, columnsAbsolute)
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var r = ss.getActiveRange();
  var dv = r.getDataValidations();
  var dvt = dv[0][0].getCriteriaType();
  if (dvt != SpreadsheetApp.DataValidationCriteria.VALUE_IN_RANGE) return;
  var dvv = dv[0][0].getCriteriaValues();
  Logger.log(dvv);
  for (var i = 0; i < dv.length; i++)
  {
    for (var j = i ? 0 : 1; j < dv[0].length; j++)
    {

      dv[i][j] = dv[0][0].copy().withCriteria(dvt, [dvv[0].offset(rowsAbsolute ? 0 : i, columnsAbsolute ? 0 : j), dvv[1]]).build();
    }
  }
  r.setDataValidations(dv);
}

function copyValidationRowsAbsolute()
{
  copyValidation(true, false);
}

function copyValidationColumnsAbsolute()
{
  copyValidation(false, true);
}
于 2017-12-03T22:16:51.703 回答
0

如果您只需要单个工作表的相对副本,您可以使用具有相对验证的 OpenOffice 或 LibreOffice 生成 ods。这是通过删除 $ 符号来完成的。如果您随后将该工作表加载到您的 google 驱动器并允许将其转换为 google 工作表,则如果您将其复制到同一张工作表中的任何位置,则数据验证范围将是相对的。如果您将其复制到同一工作簿或其他 Google 电子表格中的另一张工作表中,则它不是相对的。

例如,如果您将 A7 的验证设置为右侧的三个单元格,您将获得如下内容:

使公式相对

一旦你在没有 $ 的情况下保存它,它就是相对的。然后,当您上传它时,您会得到一张带有相关验证的表格。

于 2020-02-03T00:30:38.650 回答