我有一个 Apps 脚本代码,可以根据另一个下拉列表动态创建一个下拉列表,但生成的下拉列表没有芯片:
有什么方法可以在 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);
}
}
}
提前致谢。
目前,无法使用 Google Apps 脚本或 Google Sheets API 自定义数据验证下拉样式。您可以在此处
请求此功能我认为这是可以实现的,但这只是一种解决方法,而不是一个好的使用方法。它利用了 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,因为这将避免条件格式问题。
仍在寻找使用应用程序脚本更改芯片颜色的解决方案。感谢@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);
}
}
}
另一个解决方法:
我遇到了一个非常类似的问题,尝试从脚本将 DataValidation 设置为 Chip,以便允许从脚本填充的下拉列表中进行多项选择,正如人们所说,这(还?)是不允许的。但是,您可以在正在使用的工作表中手动将 DataValidation 设置为“chip”,然后将列表设置为“下拉(来自范围)”,然后在脚本中更新指向的范围中的数据,而不是更新实际细胞。就我而言,我只是有另一张表,其中的实际数据已锁定给用户。下拉列表(来自范围)仅显示包含数据的单元格中的值,因此您可以将范围设置为您需要的最大值。