【问题标题】:When I change a cell's background color, how can I get all cells containing the same text to change the same color in all sheets?当我更改单元格的背景颜色时,如何让包含相同文本的所有单元格在所有工作表中更改相同的颜色?
【发布时间】:2015-10-26 02:54:57
【问题描述】:

我正在为一个翻唱乐队制作一个曲目列表,其中我在单独的表格中按十年列出了我们所有的歌曲,包括单独的表格中的完整曲目列表。当我们创作新歌时,我将这些单元格涂成绿色。每当我改变颜色时(即在编辑上),我希望看到那些相同的歌曲出现在其他工作表上的任何地方都以绿色突出显示。

以下是迄今为止我从其他来源拼凑的内容:

function replace() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activecell = ss.getActiveSheet().getActiveCell().getA1Notation();
var activecellvalue = ss.getActiveSheet().getActiveCell().getValue();
var activecellcolor = ss.getActiveSheet().getActiveCell().getBackground();
var allsheets = ss.getSheets();
var s = 0;
var cells = [];


   if (activecellvalue != 'Yes'|'No' && activecellcolor == '#00ff00'){
    for (var s=0; s < allsheets.length; s++) {
      var allcells = allsheets[s].getDataRange().getValues();
     for (var i=0; i < allcells.length; i++) { 
      for (var j=0; j < allcells[i].length; j++) {    
       if (allcells[i][j].toString().match(activecellvalue) == activecellvalue) {
        var newcells = allsheets[s].getRange(i+1,j+1).getA1Notation();
        cells.push(newcells);}

    }
   }
      allsheets[s].getRange(newcells).setBackground('#00ff00');
 // cells.push(newcells);
  Logger.log(newcells);
  Logger.log(allsheets);
  Logger.log(cells)
  }
 }
}

“是”和“否”是指包含关于我们是否完成一首歌的否定或肯定信息的单元格。

我已经能够让脚本为不同工作表的不同单元格中的相同文本着色,但仍然需要修复一些问题,即允许突出显示每个工作表中的相同单元格值。

提前感谢您的帮助!

编辑: 我有一个工作(尽管看似效率低下)代码,它将在其他地方寻找活动单元格的文本并更改其单元格颜色:

function colorchange() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var activecell = ss.getActiveSheet().getActiveCell().getA1Notation();
var activecellvalue = ss.getActiveSheet().getActiveCell().getValue();
var activecellcolor = ss.getActiveSheet().getActiveCell().getBackground();
var allsheets = ss.getSheets();
var s = 0;
var name = allsheets[s].getName();
if (activecellvalue != 'Yes'|'No' && activecellcolor == '#00ff00'){
  for (var s=0; s < allsheets.length; s++) {     
     var cells = allsheets[s].getDataRange().getValues();
     for (var i=0; i < cells.length; i++) { 
      for (var j=0; j < cells[i].length; j++) { 
       if (cells[i][j].toString().match(activecellvalue) == activecellvalue) {
         var check = cells[i][j]
         var newcells = allsheets[s].getRange(i+1,j+1).getA1Notation();
         allsheets[s].getRange(newcells).setBackground('#00ff00');
         }
    }
   }
  }
}
else if (activecellvalue != 'Yes'|'No' && activecellcolor == '#ffffff'){
      for (var s=0; s < allsheets.length; s++) {     
     var cells = allsheets[s].getDataRange().getValues();
     for (var i=0; i < cells.length; i++) { 
      for (var j=0; j < cells[i].length; j++) { 
       if (cells[i][j].toString().match(activecellvalue) == activecellvalue) {
         var check = cells[i][j]
         var newcells = allsheets[s].getRange(i+1,j+1).getA1Notation();
         allsheets[s].getRange(newcells).setBackground('#ffffff');
         }
    }       
   }
  }
 }
}

问题是让这个脚本在背景颜色发生变化时触发。根据this 的说法,这样的功能还不能实现。谁能提供一个潜在的解决方案?

更新:

工作解决方案。由下拉菜单选择触发。

function songStatus()
{
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();
  var range = ss.getDataRange();
  var curCell = sheet.getActiveCell();
  var curCol = curCell.getColumn();
  var curRow = curCell.getRow();
  var allSheets = ss.getSheets();
  var songs = [];
  var status = sheet.getRange(curRow, 3).getValue();
  var genre = sheet.getRange(curRow, 11).getValue();


if (status == "Now")  {
  sheet.getRange(curRow, 1).setBackground('#f884ff');
  sheet.getRange(curRow, 3).setBackground('#f884ff');
  var song = sheet.getRange(curRow, 1).getValue().toString();

  for (var s=7; s < allSheets.length; s++) {     
   var row = allSheets[s].getDataRange().getLastRow();
   var col = allSheets[s].getDataRange().getLastColumn();
   var cells = allSheets[s].getDataRange().getValues();

   for (var i=0; i < row; i++) { 
    for (var j=0; j < col; j++) { 
     if (cells[i][j].toString().match(song) == song) {
       allSheets[s].getRange(i+1,j+1).setBackground('#f884ff');

      }
    }
    }
    }

  }
else if (status == "Next")
  {
    sheet.getRange(curRow, 1).setBackground('#f2a2a2');
    sheet.getRange(curRow, 3).setBackground('#f2a2a2');
    var song = sheet.getRange(curRow, 1).getValue().toString();

 for (var s=7; s < allSheets.length; s++) {     
   var row = allSheets[s].getDataRange().getLastRow();
   var col = allSheets[s].getDataRange().getLastColumn();
   var cells = allSheets[s].getDataRange().getValues();
     for (var i=0; i < row; i++) { 
     for (var j=0; j < col; j++) { 
      if (cells[i][j].toString().match(song) == song) {
       allSheets[s].getRange(i+1,j+1).setBackground('#f2a2a2');

      }
    }
    }
    }
}
}

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    不幸的是,onEdit 触发器仅在用户进行“编辑”时触发。但是,您是对的,更改颜色不被视为编辑。我建议在这种情况下使用一种稍微不同的方法。我建议不要通过用绿色突出显示新歌曲并让工作表运行脚本来检测该单元格的颜色是否已更改然后运行脚本以在其他工作表中查找相同的歌曲来跟踪您的新歌曲,我建议要么将您的是/否下拉到 onEdit 函数以触发颜色更改和其他脚本以在其他工作表中搜索该歌曲,或创建一个新的新/旧下拉列表来为您执行此操作。这是一个小的伪代码:

    function onEdit()
    {
      var ss = SpreadsheetApp.getActiveSpreadsheet();
      var sheet = ss.getSheetByName("Sheet1");
      var range = ss.getDataRange();
      var curCell = sheet.getActiveCell();
      var curCol = curCell.getColumn();
      var curRow = curCell.getRow();
      var allSheets = ss.getSheets();
    
      //Assuming your New/Old column in E
      var status = sheet.getRange(curRow, 6).getValue();
    
      if (status == "New")
      {
        sheet.getRange(curRow, 1, 1, range.getLastColumn()).setBackgroundRGB(230,240,220);
    
        //Assuming your song name is in Column B
        var song = sheet.getRange(curRow, 3).getValue();
    
        for (var i=0; i<allSheets.length; i++)
        {
          var sRange = allSheets[i].getDataRange();
          var sData = sRange.getValues();
          var sRows = sRange.getLastRow();
    
          for (var j=0; j<sRows; j++)
          {
            if (sData[j][1] == song)
            {
              allSheets[i].getRange(j+1, 1, 1, sRange.getLastColumn()).setBackgroundRGB(230,240,220);
            }
          }
        }
      }
    }
    

    使用这样的代码的另一个好处是,如果您的工作表演变为跟踪所有旧的、新的、进行中的、等待中的歌曲或您能想到的任何不同状态的歌曲,以及其中的每一个必须通过颜色代码一目了然地跟踪,添加 else-if 语句来为您执行此操作要容易得多。 希望这会有所帮助!

    【讨论】:

    • 很好的建议!这使我找到了一个工作脚本(请参阅原始帖子中的更新),该脚本将更改由歌曲状态下拉菜单触发的所有工作表中的歌曲颜色。
    • 很高兴它有帮助。我忘记添加的是 else-if 函数,您可以将代码拆分为 2 个函数。第二个类似于setCellBackground(使其与现有函数setBackground不同)并传递颜色十六进制代码和歌曲名称以进行搜索。因此,您的脚本将非常轻量级,并且代码对于添加到代码中的每个新 else-if 语句都是可重用的。但这取决于您是否将其视为未来的用例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多