我正在尝试生成一个脚本,根据行中其他单元格的内容更改单元格颜色。
基本上,如果条目的日期(第1列)超过前两天且单元格小于1的数字,我想将单元格(第6列)更改为红色。 但如果第三列(第5列)更改为Y,则将单元格格式化为绿色。
我遇到了第5行的getRange返回null的问题,但是想检查我是否正确地执行了此操作。 谢谢!
function formatting() {
var now = new Date().getTime();
var twoDaysInMilliseconds = 172800000;
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Enquiry Tracking');
var columnBooked = sheet.getRange(2, 5, sheet.getLastRow()-1, 1);
var bValues = columnBooked.getValues();
for (var i = 0; i < bValues.length; i++) {
var columnFU = sheet.getRange(i + 2, 6, 1, 1);
if (bValues[i][0] != 'y') {
var rowdate = new Date(sheet.getRange(i + 2, 1, 1, 1).getValue()).getTime();
if (now - rowdate > twoDaysInMilliseconds) AND (columnFU.getValue() < 1)
{
columnFU.setBackgroundColor('red');
}
}
else {
columnFU.setBackgroundColor('green');
}
}
}
答案 0 :(得分:1)
你正在走上正轨。您使用.getRange()
获得的错误可能是由于行或列的值无效。为避免此类问题,您可以依赖.getDataRange().getValues()
将整个电子表格的内容读入数组。完成后,您可以访问结果数组中任何列的值。
其他一些评论:
getValue()
或getValues()
从电子表格中读取时,包含日期的单元格显示为javascript日期对象,例如如果检查调试器,“1/1/2013 16:54:00”为(new Date(1357077240000))
。因此,您无需在代码中使用new Date(...)
。 AND
运算符为&&
。 (OR
为||
。)setBackgroundColor()
已被弃用,请改用setBackground(color)
。如果您要设置一系列颜色(就像您一样),只需使用setBackgrounds()
一次即可接受二维颜色数组,从而提高脚本效率。.getTime()
函数很快,所以它不是真的有必要重构代码。)function formatting() {
var now = new Date().getTime();
var twoDaysInMilliseconds = 2 * 24 * 60 * 60 * 1000; //172800000;
var headers = 1; // # rows of headers to skip
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Enquiry Tracking');
var data = sheet.getDataRange().getValues().splice(headers); // all data, skipping headers
var colBooked = 5-1; // Column numbers -1 to map to 0-based array
var colDate = 1-1;
var colFU = 6-1;
var colors = [];
for (var row = 0; row < data.length; row++) {
colors[row] = ['transparent']; // default - no color
if (data[row][colBooked] === 'y') {
colors[row][0] = 'LawnGreen';
}
else {
if (data[row][colFU] < 1) {
var rowdate = (data[row][colDate]).getTime();
if (now - rowdate > twoDaysInMilliseconds)
{
colors[row][0] = 'Tomato';
}
}
}
}
// Set the colors for all data cells in ColFU
sheet.getRange(1+headers,colFU+1,colors.length,colors[0].length).setBackgrounds(colors);
}