在Google Spreadsheets中复制/粘贴数据验证

Ste*_*sky 5 validation spreadsheet google-sheets

无法解决这个问题,我感到有点傻。这是我设置的数据验证:

单元格范围:Journal!J2

条件:列表范围-Journal!W2:X2

单元格范围:Journal!M2

条件:列表范围-Journal!Y2:AA2

这在我的第一行中很棒。我创建另一行,并希望将所有的“ 2”更新为“ 3”。单元格范围可以正确更新,但条件不能正确更新,除了手动输入和更新之外,我无法找到一个简单的解决方案。

我试过复制/粘贴以及粘贴特殊->数据验证。

我知道像$ Y $ 2这样的东西可以修复行/列,但这与我想要的相反。我想我想保持相对公式而不是绝对公式?

小智 5

实际上,“来自某个范围的列表”验证类型会将对列表的引用视为绝对引用,而不是相对引用。我知道两种解决方法:

自定义公式

根据自定义公式进行验证

=not(isna(match(J2, W2:X2, 0)))
Run Code Online (Sandbox Code Playgroud)

等效于“值必须在W2:X2范围内”,并且将正确复制下来,其中W2:X2的引用是相对的。

缺点:您无法通过自定义公式验证获得单元内下拉列表。

脚本

可以使用Apps脚本来管理数据验证规则。以下脚本在范围J2:J100的每个单元格中设置数据验证规则,其中值必须来自同一行的W:X。

function validate() {    
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("J2:J100");
  var valuesColumn = 23;  // begins in W 
  var valuesLength = 2;   // has length 2, so W:X
  var firstRow = range.getRow();
  for (var i = 0; i < range.getHeight(); i++) {
    var rule = SpreadsheetApp.newDataValidation()
               .requireValueInRange(sheet.getRange(firstRow + i, valuesColumn, 1, valuesLength), true)
               .setAllowInvalid(false)
               .build();
    range.offset(i, 0, 1, 1).setDataValidation(rule);
  }
}
Run Code Online (Sandbox Code Playgroud)