这是一个仅对指定列起作用的解决方案,并且还将确保输入的文本是有效的十六进制颜色代码。您可以让它监视一列的更改并将背景颜色更改应用于任何其他列,而不仅仅是紧邻的列。您也不必担心包含其他文本(如标题)的单元格,因为此代码将忽略它们。并且您可以将多行粘贴到电子表格中,因为此功能将对监视列中的任何已编辑单元格进行操作。
值得注意的是,这段代码并不是万无一失的,我也没有对其进行优化。例如,如果您尝试更改超出活动工作表当前最大范围的单元格的背景颜色,您可能会遇到错误(如果需要,您可以轻松编写代码以向工作表添加新列)。此外,如果您将大量行粘贴到工作表中,该函数可能会超时。虽然我怀疑这会在正常使用中发生,但从技术上讲,最佳做法是在 forEach 循环结束时一次性应用所有更改,而不是一次一个。
如果这就是您所说的“获取一列十六进制代码”的意思,您也可以将其重写为菜单功能。下面的代码仅适用于新输入的文本。对于预先存在的文本,重命名函数并对其进行修改以自动检查所需的列而不是用作触发器(如果您只想选择某些单元格,请检查活动范围)。没有麻烦,没有大惊小怪。
正则表达式假定有效的十六进制颜色代码是以 octothorpe 开头并后跟 3 或 6 个字符的字符串,每个字符必须是 0-9、A-F 或 a-f。
SpreadsheetApp.flush() 可能不是绝对必要的,但它应该能够在这种情况下实时更新更改。
// regex for hex color codes
HEX_COLOR_REGEX = /(^#[0-9A-Fa-f]{3}$)|(#[0-9A-Fa-f]{6}$)/;
// column to watch for changes (i.e. column where hex color codes are to be entered)
HEX_CODE_COLUMN = 1; // i.e. column A
// column to change when above column is edited
HEX_COLOR_COLUMN = 2; // i.e. column B
// utility function to test whether a given string qualifies as a hex color code
function hexTest(testCase) {
return HEX_COLOR_REGEX.test(testCase);
}
function onEdit(e) {
var range = e.range;
var row = range.getRow();
var column = range.getColumn();
if (column === HEX_CODE_COLUMN) {
var values = range.getValues();
values.forEach( function checkCode(rowValue, index) {
var code = rowValue[0];
if (hexTest(code)) {
var cell = SpreadsheetApp.getActiveSheet().getRange(row + index, HEX_COLOR_COLUMN);
cell.setBackground(code);
SpreadsheetApp.flush();
}
});
}
}