【问题标题】:Adding borders based on grouped rows and conditional formatting in Google Sheets在 Google 表格中根据分组行和条件格式添加边框
【发布时间】:2019-05-01 23:24:10
【问题描述】:

我有一张看起来像这样的工作表:

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

有了边框,产品之间就有了明显的分隔。我希望这是动态的。逻辑可能来自B 列不为空,以及紧随其后B 为空的所有行,这些行被视为一个组并在底部接界。

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

编辑:

电子表格的链接:

之前(我所拥有的): https://docs.google.com/spreadsheets/d/1r3ybiy5Gaw7SYDZlYA68HmvPCCoxI-Bz7qpPCSK146A/edit?usp=sharing

之后(基本上是我想要的): https://docs.google.com/spreadsheets/d/1sS3Y_MH4DaYD4QW19vjwExd7jc4H-eB5OAGb3J4njUQ/edit?usp=sharing

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

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

【问题讨论】:

  • 我认为 OnEdit 事件触发器可以用于动态添加边框。为了正确理解您的情况,您能否提供您要使用的示例电子表格?当然,请删除您的个人信息。
  • @Tanaike 我添加了指向电子表格的链接。
  • 感谢您回复和分享示例电子表格。通过这些示例,我提出了一个示例脚本作为答案。你能确认一下吗?如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

标签: google-apps-script google-sheets


【解决方案1】:

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

  1. 在编辑单元格时,脚本由 OnEdit 事件触发器自动运行。
  2. 检索工作表名称。
  3. 清除所有边界。
  4. 创建用于添加边框的范围列表。
  5. 使用范围列表添加边框。

我使用了上面的流程,因为我不确定编辑单元格的情况。

示例脚本:

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

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”时,将运行脚本。如需修改,请修改if (e.source.getActiveSheet().getSheetName() == "Sheet1") {

参考资料:

编辑:

  • 您的第一个共享电子表格与您的实际电子表格不同。
    • 您回复评论中的共享电子表格是实际的电子表格。
  • 您要检查“C”列并将“A”列的边框添加到“P”。
  • 数据从第 3 行开始。

如果我的理解是正确的,请将上面的脚本修改如下。

发件人:

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

【讨论】:

  • 很抱歉在接受答案后提出这个问题,但是,代码在我的实际电子表格(不是示例)中对表格的格式有点不同。我的实际电子表格如下所示:docs.google.com/spreadsheets/d/…。列向上到 P,产品名称从 C 开始,第 3 行标记实际数据的开始。我需要对您的脚本进行哪些更改?
  • @darkhorse 对于给您带来的不便,我深表歉意。我更新了我的答案。你能确认一下吗?如果我误解了您的实际电子表格,我深表歉意。
  • 效果非常好。非常感谢。
  • 注意:将最初将所有边框设置为 null 的代码行移动到添加新边框的行之前,从用户的角度来看,会消除所有滞后。感觉几乎是瞬间的。
  • 是的,完全正确。在所有循环和计算之前进行渲染会产生明显的延迟,此时边界会消失一秒钟然后再次出现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-10
  • 1970-01-01
  • 2014-11-27
  • 2019-12-10
相关资源
最近更新 更多