【问题标题】:How can you assign a color to a cell if it's value matches the value of a cell in a different sheet?如果单元格的值与不同工作表中单元格的值匹配,如何为单元格分配颜色?
【发布时间】:2021-02-10 00:42:34
【问题描述】:

我问这个问题的原因是这样一目了然,看看时间表是什么样的,而不是必须阅读所有值。

假设我有一张 Schedule 表,其中包含我的日程安排,其中每一行(不包括标题)是一个不同的时间段,并且可以分配多个人中的一个人。我希望它根据单元格的颜色与separate sheet 中的匹配值进行着色。我会从第二张表中手动添加/删除人员,并确保他们的单元格是彩色的,但如果可以避免的话,我不想每次都添加/删除另一个条件格式。目前,添加/删除条件格式是我的解决方案。

这甚至可能吗?我想将尽可能多的人添加到列表中,并且它可能会不断变化,但不想在每次发生变化时为每个人添加和删除条件格式。

如果有人想看看他们是否可以在那里解决它,我制作了一个测试电子表格:https://docs.google.com/spreadsheets/d/1hJpBIqU-vFVJFPit8FNR-X6G-Ra3ehILCySVm8fs-lk/edit?usp=sharing

【问题讨论】:

    标签: google-sheets google-sheets-formula


    【解决方案1】:

    如果没有可以读取单元格背景颜色的脚本,这是不可能的。

    如果脚本不是一个选项,您仍然可以这样做,但每个名称都需要有自己的条件格式:

    =$B2=INDIRECT("Workers!A1") 
    
    =$B2=INDIRECT("Workers!A2")
    
    =$B2=INDIRECT("Workers!A3")
    
    =$B2=INDIRECT("Workers!A4")
    

    【讨论】:

    • 那些条件格式规则是我目前的解决方案,但有点单调。脚本是一种选择,但我不知道如何去做这样的事情。
    【解决方案2】:

    鉴于使用内置函数或公式没有简单的方法来执行此操作,因此我编写了一个应该可以工作的小脚本。如果您检查example sheet,您会看到,当您将“计划”表上的 B 列中的值编辑为其中一个工人的姓名时,它会在短暂延迟后更改颜色。为此,我正在使用这个脚本:

    const ss = SpreadsheetApp.getActive();
    
    const onEdit = () => {
      setWorkerColor("B2:B","A1:A");
    }
    
    const setWorkerColor = (rangeToColor,workerList) => {
      let sheet = ss.getSheets()[0]; // ss.getSheets()[0] here means the left most sheet, change according to your needs
      let cell = sheet.getRange(rangeToColor);
      
      let rowCount = cell.getHeight();
      let workerValues = cell.getValues();
    
      // ss.getSheets()[1] means the second left-most sheet, a.k.a "Workers" sheet
      let listOfWorkers = ss.getSheets()[1].getRange(workerList).getValues().filter(worker => { 
        return worker != "" // removes all blank cells from the preset list of workers
      });
      let listOfWorkersColors = ss.getSheets()[1].getRange(workerList).getBackgrounds().filter(worker => { 
        return worker != "#ffffff" // removes all the white colored cells from the list of colors
      });
      
      let workerColorValues = new Array(workerValues);
      
      for (let i = 0; i < rowCount; i++) {
        workerColorValues[i] = new Array(0); // necessary as the array has to be 2D even if it's only one column
        if (workerValues[i] != "") {
          let foundMatch = false;
          for (let j = 0; j < listOfWorkers.length; j++) {
            if (workerValues[i][0] === listOfWorkers[j][0]) {
              workerColorValues[i][0] = listOfWorkersColors[j][0];
              foundMatch = true;
              break; // Only need to find the first match, once it's found we can exit this loop
            }
          }
          if (foundMatch === false) {
            workerColorValues[i][0] = "#ffffff";
          }
        } else {
          workerColorValues[i][0] = "#ffffff";
        }
      }
      cell.setBackgrounds(workerColorValues);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-30
      • 2019-01-23
      • 2019-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2020-07-02
      相关资源
      最近更新 更多