如何以相对方式复制数据验证,特别是从范围(带有或不带有脚本)的Google表格中列出数据

L.J*_*J.W 1 spreadsheet google-sheets-api google-sheets-query google-apps-script-editor

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

单元格C2:客户端-客户端1或客户端2。(在此示例中使用,实际列表将扩展。)

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

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

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

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

客户端列表的数据验证很简单,因为它是常量,可以在列之间进行复制。但是,不能从多个地址复制对从属地址列表的数据验证,因为它始终引用C列,并且与相对客户列表失去连接。

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

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

条件='日记(V-2.1)'!C53:C55

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

可能值得注意的是,我每列有10组这些约会空位(每天10个),所以我对每个单独的约会都使用了过滤功能,因此它们可以独立工作,但是即使这很繁琐,所以我需要能够从C列开始复制该列(或仅进行数据验证),并使它相对于该列中的过滤器功能保持不变。

请查看下面的示例电子表格链接,这一切都说得通!在示例中,我已将C列复制到D列,并且地址列表的数据验证已针对所有十个约会空位分离。(所有编辑都是免费的。)

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

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

如果有人可以提供帮助,那么我将不胜感激,因为我勤奋地搜索了论坛并且找不到解决方案。我确实看过了这个视频(这是我的头),它似乎是使用Java脚本实现的:

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

mor*_*iah 6

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);
}
Run Code Online (Sandbox Code Playgroud)