Как я могу реализовать несколько условных проверок раскрывающихся данных в Google Script? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь реализовать условные выпадающие списки на листе, который вы видите ниже, с помощью Google Script (хотя, если у вас есть другие идеи, не стесняйтесь поделиться). Я основал большую часть своего кода на этом уроке . Идея состоит в том, чтобы обновить возможные значения списка в третьем столбце («Indicador»), основываясь на значении, выбранном во втором столбце каждой соответствующей строки.

Таблица соответствия, используемая для определения того, какой список значений следует использовать, приведена на рисунке 2 (другая рабочая таблица). Обратите внимание, что значения, которые искали для , находятся в первом столбце и, возможно, возвращают списки в последнем столбце таблицы, показанной на рисунке 2 (по сути, это VLOOKUP).

Рисунок 1 - Лист с добавленным раскрывающимся списком

worksheet_implementation

Пока код выглядит так:

function getSpecVars() {

var ws_inds = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Indicadores");
var ws_support = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Apoio");
var range_valores = ws_support.getRange("A5:A9").getValues();
var range_listas = ws_support.getRange("G5:G9").getValues();

Logger.log(range_listas);

}

// Updates the value on a cell in the third column corresponding to the updated value in the same row in another column.

function onEdit(e) {
 var active_cell = e.range;
 var val = active_cell.getValue();
 var row_alter = active_cell.getRow();
 var col_alter = active_cell.getColumn();
 var row_list = range_listas.indexOf(val);
 var list = range_listas[row_list];
 var alt_cell = ws_ind.getRange(row_alter,3)

 if(col_alter === 2){
   applyValidation(list,alt_cell);
 }
}

function applyValidation(list, cell) {

  var rule = SpreadsheetApp
              .newDataValidation()
              .requireValueInList(list)
              .setAllowInvalid(false)
              .build();        
  cell.setDataValidation(rule);
}

Обратите внимание:

  • Первая функция сохраняет списки из таблицы поддержки (см. Рис. 2 ниже) в массивах для последующего использования;
  • Вторая функция фактически реализует проверку данных, опираясь на переменные, хранящиеся в первой и третьей функциях.
  • Третья функция является обобщенной c функция для настройки списка проверки данных в любой заданной ячейке.

Рисунок 2 - Вспомогательный лист со списками, которые необходимо добавить в раскрывающиеся меню

support_worksheet

То, что я ожидал увидеть:

Я ожидал, что клетки на третий столбец первого листа (рисунок 1, выше), чтобы разрешить ввод только из раскрывающегося списка, отфильтрованного / выбранного в соответствии с названием категории во втором столбце. Другими словами, я ожидаю, что скрипт OnEdit реализует список проверки данных в третьем столбце всякий раз, когда я изменяю значение во втором столбце.

Что я получаю:

Ничего, на самом деле. Это ничего не делает. Есть идеи?

1 Ответ

0 голосов
/ 27 марта 2020
function get_range_listas() {
  return SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("Apoio")
    .getRange("A5:A9")
    .getValues() // <- getValues returns a 2d Array
    .map(function (r) {
        return r[0];
    }); // <- unwrap to Array
}

function get_range_valores() {
  return SpreadsheetApp.getActiveSpreadsheet()
    .getSheetByName("Apoio")
    .getRange("G5:G9")
    .getValues() // <- getValues returns a 2d Array
    .map(function (r) {
        return r[0];
    }); // <- unwrap to Array
}

/*
 * Updates the value on a cell in the third column corresponding to
 * the updated value in the same row in another column.
 */

function onEdit(e) {

  if (
    e.source.getActiveSheet().getName() !== "Indicadores" ||
    e.range.columnStart !== 2
  ) { return; }

  var active_cell = e.range;
  var val = e.value;
  var row_list = get_range_listas().indexOf(val);
  var list = get_range_valores()[row_list].split(",");

  var rule = SpreadsheetApp.newDataValidation()
    .setAllowInvalid(false)
    .requireValueInList(list, true)
    .build();

  e.range.offset(0, 1).setDataValidation(rule);
}
...