Раскрывающееся меню проверки данных листов Google показывает значения, но вставить формулу? - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть список гиперссылок, хранящихся в диапазоне, и я хотел бы, чтобы проверка данных в другом столбце позволяла вам выбрать из ссылки "текст", а затем вставить полную формулу ячейки. Как это работает в данный момент, ячейка проверки данных содержит только значение ячейки.

Only copying cell value

Ссылка на пример листа

Некоторые коды функций листа:

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

Что я могу сделать с кодом сценария, чтобы он вставил формулу вместо значения? Или это лучший вариант для запуска при выборе нового значения, а затем сделать что-то вроде:

Att! Псевдокод

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

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Поскольку ограничение в 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)
  }
}

Спасибо за все ваши комментарии и предложения, которые привели меня к этому ответу.

0 голосов
/ 07 ноября 2019

Это немного сложно, но я думаю, что нашел решение, используя 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);


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...