如何使用Google脚本将数据验证从一个电子表格复制到另一个电子表格

时间:2018-10-27 18:41:50

标签: google-sheets spreadsheet

我正在尝试编写脚本,该脚本将从控制电子表格中获取具有数据验证的单元格,并将其添加到另一个电子表格中的位置(相同)。

我正在使用:

  var myCell = SpreadsheetApp.getActive().getRange('D4');
  var rule = myCell.getDataValidation();

但是很明显,电子表格在脚本过程中没有处于活动状态,因此该规则为空。

1 个答案:

答案 0 :(得分:0)

如果您可以检查this product forum,则在那里得到了回答。

此外,在SO post之一中提到当前不支持此功能。但是他们提供了解决方法。

复制sheet from the original post,然后执行以下步骤:

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

此外,如果您想从头开始创建,我会发布与SO帖子中指定的脚本相同的脚本:

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);
}