Google脚本可以在多个工作表中使用

时间:2012-09-10 22:17:58

标签: google-apps-script

我是Google脚本的新手,如果这个问题已经得到解答,请致歉。

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

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

我遇到的问题是我只能将代码放在一张纸上。

以下代码(由ScampMichael提供)与我想要根据“状态”列中的值更新整行一样,但是我不能让它在同一工作簿中的多个工作表(具有不同的名称)上工作。

我已尝试将代码作为单独的脚本,其中包含已编辑的工作表名称和列编号,以便每个脚本引用单个工作表,但仍然只更新了1个工作表。

有人可以建议我如何编辑此代码或如何复制它以便可以在多个工作表中使用?

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);
}

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

更简单的方法

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 */
}

答案 1 :(得分: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);
}