簡體   English   中英

更新到Google表格顏色更改中的第一個單元格

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM