[英]Color rows based on date in merged cell in first column in Google Sheet script
[英]Update to first cell in Google Sheet color change
前幾天,我發布了一篇有關如何使用Google表格將單元格的背景顏色更改為紅色(如果該行中的任何單元格具有紅色背景)的信息。 我現在試圖使其檢查黃色,橙色和紅色,並相應地更改第一個單元格(然后替換每種顏色,因此僅當沒有橙色或紅色單元格時才是黃色)。
Serge insas提供的非常有效的代碼是:
function MakeRed(){
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet = book.getActiveSheet();
var first_column = "B";
var first_row = 1;
var last_row = sheet.getLastRow();
var last_column = sheet.getLastColumn();
var active_row = 1;
var range_input = sheet.getRange(1,1,last_row,last_column);
var range_output = sheet.getRange("A1");
var cell_colors = range_input.getBackgroundColors();
var color = "#ff0000";
for(var r = 0; r < cell_colors.length; r++) {
var rowWoColA = cell_colors[r].slice(1);
if(rowWoColA.indexOf(color)>-1) {
cell_colors[r][0]=color;
} else {
cell_colors[r][0]="#ffffff";
}
}
range_input.setBackgroundColors(cell_colors);// update sheet colors
}
我將代碼修改為我認為適用於該修訂版的代碼,但是卻一無所獲(奇怪的是,在Google表格中,“執行記錄”仍然為空白?)
function ColorOfCol(){
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet = book.getActiveSheet();
var first_column = "B";
var first_row = 1;
var last_row = sheet.getLastRow();
var last_column = sheet.getLastColumn();
var active_row = 1;
var range_input = sheet.getRange(1,1,last_row,last_column);
var range_output = sheet.getRange("A1");
var cell_colors = range_input.getBackgroundColors();
var color1 = "#ffff00";
var color2 = "#ff9900";
var color3 = "#ff0000";
for(var r = 0; r < cell_colors.length; r++) {
var rowWoColA = cell_colors[r].slice(1);
if(rowWoColA.indexOf(color1)>-1) {
cell_colors[r][0]=color1;
} else if(rowWoColA.indexOf(color2)>-1) {
cell_colors[r][0]=color2;
} else if(rowWoColA.indexOf(color3)>-1) {
cell_colors[r][0]=color3;
} else {
cell_colors[r][0]="#ffffff";
}
}
range_input.setBackgroundColors(cell_colors);// update sheet colors
}
此處添加的代碼對我來說工作正常。 但是,請確保您沒有在空的Google表格上測試此代碼,因為以下代碼返回的值基於單元格中的文本值,而不是背景色。
var last_row = sheet.getLastRow();
var last_column = sheet.getLastColumn();
也能夠在Apps腳本控制台中正確查看執行記錄。
希望有幫助!
正如我之前的評論所指出的,只要您滿足條件,代碼就可以工作。 但是,即使工作表中沒有數據,對SpreadsheetApp.getActiveSpreadsheet()
的第一次調用也應該在執行腳本中產生一個條目。 您認為這很奇怪是對的。
驗證預期條件是個好習慣,如果未滿足重要條件,則提醒用戶注意。 就您而言,如果電子表格中沒有數據,那么您將不會讀取任何顏色-這很可悲。 您可以檢查條件並引發錯誤,例如:
if (cell_colors.length == 0) throw new Error( 'No data in sheet' );
很酷的事情-使用getDataRange()
可以避免這種情況,因為即使工作表為空,它也總是返回一個范圍,在這種情況下,它將只是A1
。 無論如何,將僅檢查其中包含數據的行-因此您可能仍會在A列中看到沒有預期顏色的行。
這是您的函數的更緊湊的版本:
function ColorOfCol(){
var book = SpreadsheetApp.getActiveSpreadsheet();
var sheet = book.getActiveSheet();
var range_input = sheet.getDataRange();
var cell_colors = range_input.getBackgrounds();
if (cell_colors.length == 0) throw new Error( 'No data in sheet' );
// List of colors in priority order, default at end.
var color = ["#ffff00","#ff9900","#ff0000","#ffffff"];
for (var r = 0; r < cell_colors.length; r++) {
// check for all colors EXCEPT our default, the last in color[]
for (var b=0; b<color.length-1; b++) {
// -1 means not found, but 0 means found in first column, which we don't care about
if (cell_colors[r].indexOf(color[b])>0) {
// found this color, stop searching, with 'b' == found color
break;
}
}
// 'b' will contain the color index. If none found, it will be the last color, our default.
cell_colors[r][0]=color[b];
}
range_input.setBackgrounds(cell_colors);// update sheet colors
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.