我正在尝试编写一个脚本,该脚本将采用一列十六进制代码并将相邻列的背景颜色设置为十六进制代码颜色,但我不知道该怎么做。
我一直在看这些:
1) https://developers.google.com/apps-script/reference/spreadsheet/range#setbackgroundcolor
2) https://developers.google.com/apps-script/reference/spreadsheet/range#getcellrow-column
3) Google Spreadsheet: Script to Change Row Color when a cell changes text;
但是并没有真正取得任何进展。任何帮助将不胜感激!
谢谢!
答案 0 :(得分:1)
这样的事情可以解决你的问题:
getCell(row,column).setBackground(String)
虽然,这一次只能为一个单元格着色,但它描述了如何根据单元格输入设置背景颜色。根据您的使用情况,您是否一次复制粘贴多个十六进制代码,或者您是否有现有的十六进制代码,并且您希望显示它们的颜色,使用{{1}}应该能够帮助您进行。
答案 1 :(得分:0)
这是一个只对指定列起作用的解决方案,并且还要确保输入的文本是有效的十六进制颜色代码。您可以让它观察一列进行更改,并将背景颜色更改应用于任何其他列,而不仅仅是紧邻的列。您也不必担心包含其他文本的单元格,例如标题,因为此代码将忽略它们。您可以将多行粘贴到电子表格中,因为此功能将对观察列中任何已编辑的单元格进行操作。
值得注意的是,这段代码并非万无一失,我还没有对它进行优化。例如,如果您尝试更改超出活动工作表当前最大范围的单元格的背景颜色,则可能会出现错误(如果需要,您可以轻松编写代码以向工作表添加新列)。此外,如果将极大量的行粘贴到工作表中,则该功能可能会超时。虽然我怀疑这会在正常使用中发生,但从技术上讲,最佳做法是在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();
}
});
}
}