如何在Google应用脚本中创建动态下拉列表

时间:2012-07-03 03:49:19

标签: google-apps-script

我想使用Google Apps脚本动态更改Google电子表格的单元格验证功能中候选列表的值。

我无法使用Google公式功能在Google电子表格中创建动态下拉列表。在Excel中,可以在Excel电子表格中使用在下拉列表功能工作的单元格中设置的INDIRECT函数,引用其值的动态设置列表范围名称的单元格。

2 个答案:

答案 0 :(得分:3)

不幸的是,使用Apps Script管理单元格验证是不可能的。对此有一个增强request opened。你应该对其进行加星标记以跟踪更新和投票类型。

此外,Excel INDIRECT功能不适用于Google Spreadsheets。

答案 1 :(得分:1)

Times have changed see this blog post

My spreadsheet example that could use some improvements

博客发布了一个简单的方法。 我的代码启动器是

function loadMenu() {
  var ga = SpreadsheetApp.getActive();

  var firstMenu = 'B3:B4';
  var firstValues = 'E3:F3';
  var staticValue1 = 'E3';
  var staticValue2 = 'F3';

  var secondMenu = 'C';
  var secondMenuRow = 3;
  var secondMenu1 = 'E4:E';
  var secondMenu2 = 'F4:F';

  dynamicDrop(ga, firstMenu, firstValues, staticValue1, staticValue2, secondMenu, secondMenuRow, secondMenu1, secondMenu2);

}


function dynamicDrop(ga, fm, fv, sv1, sv2, sm, smr, sm1, sm2) {

  //first drop choices
  var cells = ga.getRange(fm);
  var range = ga.getRange(fv);
  var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
  cells.setDataValidation(rule);

  // set as static value
  var staticVar1 = ga.getRange(sv1).getValue();

  // set as static value
  var staticVar2 = ga.getRange(sv2).getValue();

  // set to chosen value of fm
  var chosenVar1 = ga.getRange(fm).getValues();

  for (var row in chosenVar1) {

    for (var col in chosenVar1[row]) {

      if (chosenVar1[row][col] == staticVar1) {

        num = parseInt(row) + smr;
        var cells = ga.getRange(sm+num);
        var range = ga.getRange(sm1);
        var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
        cells.setDataValidation(rule);

      } else if (chosenVar1[row][col] == staticVar2) {

        num = parseInt(row) + smr;
        var cells = ga.getRange(sm+num);
        //range is Static values
        var range = ga.getRange(sm2);
        var rule = SpreadsheetApp.newDataValidation().requireValueInRange(range).build();
        cells.setDataValidation(rule);

      }
    }
  }
}