【问题标题】:Google sheets data validation drop-down menu show values but paste formula?谷歌表格数据验证下拉菜单显示值但粘贴公式?
【发布时间】:2019-11-07 10:38:58
【问题描述】:

我有一个存储在一个范围内的超链接列表,我希望在不同的列中进行数据验证,允许您从链接“文本”中进行选择,然后粘贴完整的单元格公式。目前数据验证单元格的工作方式仅包含单元格值。

链接到example sheet

部分表单功能代码:

C2: =HYPERLINK("#rangeid=901904080","Cell E2")
C3: =HYPERLINK("#rangeid=951806747","Cell E3")
C4: =HYPERLINK("#rangeid=743771733","Cell E4")

自动录制的脚本代码:

function DV() {
  var spreadsheet = SpreadsheetApp.getActive();
  spreadsheet.getRange('C2').activate();
  spreadsheet.getRange('A2:A').setDataValidation(SpreadsheetApp.newDataValidation()
  .setAllowInvalid(false)
  .requireValueInRange(spreadsheet.getRange('Sheet2!$C$2:$C'), true)
  .build());
};

我可以对脚本代码做些什么来让它粘贴公式而不是值?或者是尝试在选择新值时触发的最佳选择,然后执行以下操作:

攻击!伪代码

onEdit(e){
  //pseudo code
  if e.range in column A{
    var sourceRange = sheet.getRange("C2:C")
    var index = sourceRange.indexOf(e.range.getValue())
    e.range.setFormula(sourceRange[index].getFormula())
  }
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    这有点棘手,但我想我使用DataValidationBuilder 找到了解决方案。它与您的类似,但使用getFormulas() 以及验证属性requireValueInList(),它要求一个字符串数组。

    主要问题是当您选择公式时,“无效规则”通知会跳入,例如,因为公式将单元格值更改为“单元格 C3”。所以为了解决这个悖论,你需要将setAllowInvalid(boolean) 设置为false:

    function DV(){
    
      var spreadsheet = SpreadsheetApp.getActive();
      var cells = spreadsheet.getRange('A2:A');
      var rule = SpreadsheetApp.newDataValidation()
                 .requireValueInList(spreadsheet.getRange('C2:C').getFormulas())
                 .setAllowInvalid(false)
                 .build();
      cells.setDataValidation(rule);
    
    
    }
    

    【讨论】:

    • 我只是尝试将您的函数复制粘贴到我的脚本中并运行它,但我收到此错误消息:The data validation rule has more items than the limit of 500. Use the ‘List from a range’ criteria instead. 并尝试使用requireValuesInRange() 给出此错误消息Cannot convert Array to SpreadsheetApp.Range.
    • 我明白了。我猜你必须限制值的范围。例如,尝试将 'C2:C' 更改为 C2:C4,或者您拥有的最后一个 C 行。
    • 我愿意,但问题是范围会随着时间的推移继续增长,很可能会超过 500。
    • 我做了一些测试,但我认为这是不可能的。 RequireValueinRange 没有此限制,但您不能使用它,因为您需要将公式作为字符串而不是单元格的值。
    【解决方案2】:

    由于 500 项限制在我的情况下是不可接受的,我通过检查已编辑单元格上的数据验证规则解决了问题,如果存在,则交换数据的值。

    MWE:

    function onEdit(e){
      if (e.range.getDataValidation() != null){
        swapValueForFormula(e.range);
      }
    
    function swapValueForFormula(cell){
      var val = cell.getValue();
      var rule = cell.getDataValidation();
      var source = rule.getCriteriaValues()[0];
      var vals = source.getValues();
      var index = vals.join().split(",").indexOf(val);
      if (index != -1){
        var formula = source.getCell(index+1, 1).getFormula()
        cell.setFormula(formula)
      }
    }
    

    感谢您的所有 cmets 和建议,使我得到这个答案。

    【讨论】:

      猜你喜欢
      • 2021-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多