Google apps script 在Google工作表中基于分组行和条件格式添加边框

Google apps script 在Google工作表中基于分组行和条件格式添加边框,google-apps-script,google-sheets,Google Apps Script,Google Sheets,我有一张这样的纸: 如您所见,这是一个简单的库存跟踪系统。现在,我有3种产品。有些产品实际上没有不同的颜色(如俗气的设计t恤),因此对于这些产品,变体(颜色)保持为空。我面临的一个问题是,要真正理解我在哪一行有点困难,因为有些单元格是空的。理想情况下,我希望电子表格如下所示: 有了边界,产品之间就有了明显的分离。我希望这是动态的。逻辑可能来自不为空的B列,在该列后面的所有行中B为空,这些行被视为一个组,并在底部加上边框 有没有办法做到这一点,以便每当我添加新产品时,它都会相应地分组?谢谢你的

我有一张这样的纸:

如您所见,这是一个简单的库存跟踪系统。现在,我有3种产品。有些产品实际上没有不同的颜色(如俗气的设计t恤),因此对于这些产品,变体(颜色)保持为空。我面临的一个问题是,要真正理解我在哪一行有点困难,因为有些单元格是空的。理想情况下,我希望电子表格如下所示:

有了边界,产品之间就有了明显的分离。我希望这是动态的。逻辑可能来自不为空的
B
列,在该列后面的所有行中
B
为空,这些行被视为一个组,并在底部加上边框

有没有办法做到这一点,以便每当我添加新产品时,它都会相应地分组?谢谢你的帮助

编辑:

电子表格链接:

之前(我所拥有的):

之后(基本上是我想要的):

简而言之,我想根据以下两个条件根据产品名称对产品进行分组:

  • 如果一行没有名称,我们假设它是最接近的一行的变体,该行具有产品名称
  • 如果两行具有相同的产品名称,我们显然会假定它们是同一产品的变体

    • 这个示例脚本怎么样?在本示例脚本中,当您编辑“Sheet1”工作表中的单元格时,OnEdit事件触发器会动态添加边框。请把这看作是几个答案中的一个。此脚本的流程如下所示

    • 编辑单元格时,OnEdit事件触发器会自动运行脚本
    • 检索图纸名称
    • 清除所有边界
    • 创建用于添加边框的范围列表
    • 使用范围列表添加边框
    • 我使用了上面的流程,因为我不确定编辑单元格的情况

      示例脚本: 请将以下脚本复制并粘贴到电子表格的容器绑定脚本(在这种情况下,请在电子表格之前执行此操作)。编辑单元格时,会添加边框

      function onEdit(e) {
        if (e.source.getActiveSheet().getSheetName() == "Sheet1") {
          var sheet = e.source.getActiveSheet();
          sheet.getRange(1, 1, sheet.getMaxRows(), sheet.getMaxColumns()).setBorder(null, null, null, null, false, false);
          var values = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getValues();
          var rangeList = values.reduce(function(ar, e, i) {
            if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
              ar.push("A" + (i + 1) + ":D" + (i + 1));
            }
            return ar;
          }, [])
          rangeList.push(sheet.getRange(sheet.getLastRow(), 1, 1, sheet.getLastColumn()).getA1Notation());
          sheet.getRangeList(rangeList).setBorder(null, null, true, null, false, false, "black", SpreadsheetApp.BorderStyle.SOLID_THICK);
        }
      }
      
      注:
      • 在此示例脚本中,当编辑的图纸名称为“Sheet1”时,将运行脚本。如果要修改此项,请修改
        如果(e.source.getActiveSheet().getSheetName()==“Sheet1”){
      参考资料:
      编辑:
      • 您的第一个共享电子表格与实际电子表格不同。
        • 回复评论中的共享电子表格是实际的电子表格
      • 您需要检查列“C”,并将列“A”的边框添加到“P”
      • 数据从第3行开始
      如果我的理解是正确的,请修改上述脚本如下

      发件人: 致: 及

      发件人: 致:
      我认为OneEdit事件触发器可用于动态添加边框。为了正确了解您的情况,您能否提供一个您想要使用的电子表格示例?当然,请删除您的个人信息。@Tanaike我添加了电子表格的链接。感谢您回复和共享电子表格示例。通过这些举例来说,我提出了一个示例脚本作为答案。你能确认一下吗?如果我误解了你的问题,并且这不是你想要的结果,我很抱歉。很抱歉在接受答案后提出这个问题,但是,在我的实际电子表格中,代码的格式有点不同(不是示例)。我的实际电子表格如下所示:。列转到P,产品名称从C开始,第三行标记实际数据的开始。我需要对您的脚本进行哪些更改?@darkhorse我为给您带来的不便表示歉意。我更新了我的答案。您能确认吗?如果我误解了您的实际电子表格,我表示歉意。Works非常好。非常感谢。注意:将最初将所有边框设置为空的代码行移动到添加新边框的代码行之前,可以消除用户角度的所有延迟。感觉几乎是即时的。是的,这是完全正确的。在所有循环和计算之前进行渲染会产生明显的延迟,其中他消失了一秒钟,又出现了。
      var values = sheet.getRange(2, 2, sheet.getLastRow() - 1, 1).getValues();
      
      var values = sheet.getRange(3, 3, sheet.getLastRow() - 1, 1).getValues();
      
      if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
        ar.push("A" + (i + 1) + ":D" + (i + 1));
      }
      
      if (i > 0 && values[i - 1][0] != e[0] && e[0] != "") {
        ar.push("A" + (i + 2) + ":P" + (i + 2));
      }