我正在使用Google工作表上的Google App脚本,我从时间驱动的触发器运行此功能。我希望能够在工作表上定位特定单元格(如果单元格值="打开"),以便我可以更改单元格的背景颜色。我想知道如何才能完成这项工作?我能够定位单元格,但是我不知道如何更改单元格背景的属性,因为无法调用.setBackground()。
function myColorFunction() {
var s = SpreadsheetApp.getActiveSheet();
var ss = SpreadsheetApp.getActiveSpreadsheet();
var range = ss.getSheetByName("Form Responses 1").getRange(2,6,ss.getLastRow());
var cellRange = range.getValues();
Logger.log(cellRange);
Logger.log(cellRange.length);
Logger.log(cellRange.valueOf());
for(i = 1; i<cellRange.length; i++){
if(cellRange[i] == "Open")
{
Logger.log("change color here");
} else {
Logger.log("don't change color");
}
}
}
答案 0 :(得分:4)
修改
自V8 runtime引入以来,人们就可以利用现代ES6功能,例如箭头功能和解构功能。此外,可以对脚本进行优化,以免在大型集合中变得缓慢。
首先,遵循最佳实践很重要。诸如getRange
,setBackground
,setValue
之类的I / O(输入/输出)操作很慢。不要在循环内使用它们,而应使用getBackgrounds
,setBackgrounds
,setValues
,setFontColors
等批处理操作。
第二,处理值网格比每次需要移至另一行时偏移范围要快得多。链接getDataRange
和getValues
以从工作表中获取所有值并直接在结果数组上工作(如果工作表中有很多数据,请根据自己的喜好使用getRange
遵循相同的原则。
最后,硬编码工作表名称使脚本不灵活,它应该是函数的参数,或者至少是函数可以访问的上下文中的已声明常量。
代码段
鉴于上述修改,(其他答案的)代码段可以进行如下修改:
const myColorFunction = ({
sheetName = "Form Responses 1",
targetValue = "Open"
} = {}) => {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName(sheetName);
const rng = sheet.getDataRange();
const numHeaders = 1;
const backgrounds = rng.getBackgrounds();
const fontColors = rng.getFontColors();
const newBckgs = backgrounds.map((row) => {
const [firstCell] = row;
if (firstCell === targetValue) {
row[5] = "red";
}
return row;
});
const newColors = fontColors.map((row) => {
const [firstCell] = row;
if (firstCell === targetValue) {
row[5] = "white";
}
return row;
});
rng.setBackgrounds(newBckgs);
rng.setFontColors(newColors);
}
注释
map
通话,但是
我将它们拆分为更清晰的流程,并避免突变
backgrounds
或fontColors
数组。"red"
和"white"
以及用于设置颜色的列索引。答案 1 :(得分:3)
您可以将setBackground
属性与getRange
一起使用。请尝试以下代码段。
function myColorFunction() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var range = ss.getSheetByName("Form Responses 1").getRange(2,6,ss.getLastRow());
var cellRange = range.getValues();
for(i = 0; i<cellRange.length-1; i++){
if(cellRange[i][0] == "Open")
{
ss.getSheetByName("Form Responses 1").getRange(i+2,6).setBackground("red");
ss.getSheetByName("Form Responses 1").getRange(i+2,6).setFontColor('white');
}
}
}