使用 Apps 脚本在 Google Sheet 中创建 Chips 下拉列表

问题描述 投票:0回答:4

我有一个 Apps 脚本代码,可以根据另一个下拉列表动态创建一个下拉列表,但生成的下拉列表没有芯片:

enter image description here

有什么方法可以在 Apps 脚本中自定义下拉样式吗?

代码如下:

function onEdit() {
  var monthTabs = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

  var aCell = SpreadsheetApp.getActiveSheet().getActiveCell();
  var aColumn = aCell.getColumn();

  if (aColumn == 4 && monthTabs.includes(SpreadsheetApp.getActiveSheet().getName())) {
    var cellContent = aCell.getValue();
    var range = SpreadsheetApp.getActiveSheet().getRange(aCell.getRow(), aColumn + 1);

    if (cellContent == "") {
      range.clearDataValidations();
    }
    else {
      var sourceRange = SpreadsheetApp.getActiveSpreadsheet().getRangeByName(cellContent);
      var rule = SpreadsheetApp.newDataValidation().requireValueInRange(sourceRange, true).build();
      range.setDataValidation(rule);
    }
  }
}

提前致谢。

validation google-apps-script google-sheets drop-down-menu
4个回答
3
投票

目前,无法使用 Google Apps 脚本或 Google Sheets API 自定义数据验证下拉样式。您可以在此处

请求此功能

3
投票

我认为这是可以实现的,但这只是一种解决方法,而不是一个好的使用方法。它利用了 range.copyTo 还将芯片样式复制到目标单元格的事实。我已经根据您提供的代码设置了一个演示表,但它可能需要重新设计以适合您的实际情况。

电子表格: https://docs.google.com/spreadsheets/d/1fTUd85YY9GUNgLPOPDHisIpUiPllgz829EuFOR_k8V0/edit?usp=sharing

function onEdit(e) {
  var monthTabs = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

  var aCell = e.range;

  if (aCell.getColumn() === 4 && monthTabs.includes(e.source.getActiveSheet().getName())) {
    var cellContent = aCell.getDisplayValue();
    var range = e.source.getActiveSheet().getRange(aCell.getRow(), aCell.getColumn() + 1);

    if (cellContent === "") {
      range.clearDataValidations();
    }
    else {
      switch(e.source.getActiveSheet().getName()) {
        case "Jan":
          SpreadsheetApp.getActiveSpreadsheet().getRangeByName("JanChip").copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
          break;
        case "Feb":
          SpreadsheetApp.getActiveSpreadsheet().getRangeByName("FebChip").copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
          break;
        default:
          break;
      }
    }
  }
}

我很难用文字描述这个过程,所以如果您需要了解更多信息,请查看电子表格。它确实使用了命名范围和帮助表。

进行编辑以在脚本中包含 CopyPasteType,因为这将避免条件格式问题。


0
投票

仍在寻找使用应用程序脚本更改芯片颜色的解决方案。感谢@Dreadnotic 让我们更加接近。

我要做的唯一编辑是删除该 switch 语句以实现相同的结果

function onEdit(e) {
 var monthTabs = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

 var aCell = e.range;

 if (aCell.getColumn() === 4 && monthTabs.includes(sheetName = e.source.getActiveSheet().getName())) {
  var cellContent = aCell.getDisplayValue();
  var range = e.source.getActiveSheet().getRange(aCell.getRow(), aCell.getColumn() + 1);

  if (cellContent === "") {
   range.clearDataValidations();
  }
  else {
   SpreadsheetApp.getActiveSpreadsheet().getRangeByName(sheetName + "Chip").copyTo(range, SpreadsheetApp.CopyPasteType.PASTE_DATA_VALIDATION, false);
  }
 }
}

0
投票

另一个解决方法:

我遇到了一个非常类似的问题,尝试从脚本将 DataValidation 设置为 Chip,以便允许从脚本填充的下拉列表中进行多项选择,正如人们所说,这(还?)是不允许的。但是,您可以在正在使用的工作表中手动将 DataValidation 设置为“chip”,然后将列表设置为“下拉(来自范围)”,然后在脚本中更新指向的范围中的数据,而不是更新实际细胞。就我而言,我只是有另一张表,其中的实际数据已锁定给用户。下拉列表(来自范围)仅显示包含数据的单元格中的值,因此您可以将范围设置为您需要的最大值。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.