2

我是谷歌脚本的新手,如果这个问题已经得到解答,我深表歉意。

我有一个包含多个工作表的电子表格,其中一些工作表在某处有一个状态列。

使用我已经发现的代码,我可以根据状态列中单元格中的值设置整个行的颜色。

我遇到的问题是我只能让代码在一张纸上工作。

以下代码(由 ScampMichael 编写)的工作原理与我希望根据 Status 列中的值更新一整行的方式完全相同,但我无法让它在同一个工作簿中的多个工作表(具有不同名称)上工作。

我已经尝试将代码作为单独的脚本使用编辑过的工作表名称和列号,以便每个都引用一个单独的工作表,但仍然只有一张工作表被更新。

请有人建议我如何编辑此代码或如何复制它以便跨多个工作表工作?

function onEdit(e) {

  var statusCol = 2; // replace with the column index of Status column A=1,B=2,etc

  var sheetName = "Services"; // replace with actual name of sheet containing Status

  var cell = e.source.getActiveCell();
  var sheet = cell.getSheet();
  if(cell.getColumnIndex() != statusCol || sheet.getName() != sheetName) return;

  var row = cell.getRowIndex();
  var status = cell.getValue();

  // change colors to meet your needs
  var color;
  switch(status ) {
    case "Down":
      color = "red";
      break;
    case "":
      color = "White";
      break;
    case "Up":
      color = "green";
      break;
  }
  sheet.getRange(row + ":" + row ).setBackgroundColor(color);
}

谢谢你。

4

2 回答 2

1

电子表格只能有一个 onEdit() 函数。因此,对任何工作表所做的编辑都必须在同一个函数中处理。

一种方法不是硬编码 statusCol 的值,而是在运行时获取它。在许多可能的方法中,我将在这里给出两个

更简单的方法

var statusCols = { 'Sheet1' : 1,
                   'Sheet2' : 2,
                   'Sheet3' : 7  //etc.
                 };


function onEdit(e){
  var cell = e.source.getActiveCell();
  var sheet = cell.getSheet();

  var sheetName = sheet.getName(); 
  var statusCol = statusCols[sheetName];

  /* Whatever code you already have */
}

第二种方法更通用

function onEdit(e){   
  var cell = e.source.getActiveCell();   
  var sheet = cell.getSheet();
  var headers= sheet.getDataRange().getValues()[0]; //Assuming headers on the first row only   
  var statusCol = headers.indexOf('Status') + 1 ; // Replace Status by the actual column header 
  /* Your existing code here */
}
于 2012-09-11T04:21:12.810 回答
0

@Srik - 谢谢。

使用第二种方法,我现在拥有以下跨多个选项卡工作的代码:

function onEdit(e){   
  var cell = e.source.getActiveCell();   
  var sheet = cell.getSheet();
  var headers= sheet.getDataRange().getValues()[0]; //Assuming headers on the first row only   
  var statusCol = headers.indexOf('Status') + 1 ; // Replace Status by the actual column header 

  var row = cell.getRowIndex();
  var status = cell.getValue();

  // change colors to meet your needs
  var color;
  switch(status ) {
    case "Down":
      color = "RED";
      break;
    case "Up":
      color = "LIME";
      break;
    case "":
      color = "WHITE";
      break;
  }
  sheet.getRange(row + ":" + row ).setBackgroundColor(color);
}
于 2012-09-11T08:42:46.957 回答