如何在 Google Apps 脚本中添加和删除边框

Posted

技术标签:

【中文标题】如何在 Google Apps 脚本中添加和删除边框【英文标题】:How to add and remove borders in Google Apps Script 【发布时间】:2021-01-18 12:48:56 【问题描述】:

目标:

    根据下表 H 列中的单元格是否不为空,为单元格区域添加边框。该表包含名称和总票号,它们会根据我使用 QUERY 函数提取的数据的某些日期自动出现或消失。我希望能够为名称出现在 H 列的单元格中的单元格范围添加边框。

例如,假设第一次,在单元格 H3 中,出现了一个名为“John A”的名称。在这种情况下,我希望能够为 H3:I3 添加边框。如果“John B”出现在“John A”下方,那么我想为 H4:I4 添加另一个边框。以此类推。

    根据是否删除了 H 列单元格中的值来删除边框。

例如,如果单元格 H4 的“John B”被自动删除,那么我还想删除 H4:I4 的边框。如果“John A”也从单元格 H3 中删除,那么我还想删除 H3:I3 的边框。

当前代码: 我正在尝试将位于另一个文件中的 onEdit() 函数的参数传递给 insertDynamicBorders() 函数,因为我认为这将是事件触发问题。

function insertDynamicBorders(row) 
  var statusSheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Status");

  // Columns
  dateColumn = 1;

  if (row > 16) 
    if (statusSheet.getRange("H3") != null ) 
      var cell = statusSheet.getRange("H3:I3");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
     else 
      var cell = statusSheet.getRange("H3:I3");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    
    if (statusSheet.getRange("H4") != null) 
      var cell = statusSheet.getRange("H4:I4");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
     else 
      var cell = statusSheet.getRange("H4:I4");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    
    if (statusSheet.getRange("H5") != null) 
      var cell = statusSheet.getRange("H5:I5");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
     else 
      var cell = statusSheet.getRange("H5:I5");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    
    if (statusSheet.getRange("H6") != null) 
      var cell = statusSheet.getRange("H6:I6");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
     else 
      var cell = statusSheet.getRange("H6:I6");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    
    if (statusSheet.getRange("H7") != null) 
      var cell = statusSheet.getRange("H7:I7");
      cell.setBorder(true, true, true, true, true, true, "black", SpreadsheetApp.BorderStyle.SOLID);
     else 
      var cell = statusSheet.getRange("H7:I7");
      cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.SOLID);
    
  

问题:

    当名称出现在 H 列的单元格中时,不会添加边框,但是当我使用 QUERY 函数直接更改从数据源中提取的数据源时会添加边框。 添加边框后,它们会添加到包含名称的单元格区域,也不包含在 H 列的单元格中。

【问题讨论】:

“脚本执行和 API 请求不会导致触发器运行。例如,调用 Range.setValue() 编辑单元格不会导致电子表格的 onEdit 触发器运行”link 阅读有关简单触发器的文档。他们只响应用户的编辑。 我诚挚的道歉,感谢您的反馈。我将通过文档并尝试更多地了解简单的触发器。 【参考方案1】:

在使用 Apps 脚本触发器时,尤其是 onEdit,请务必注意 following:

onEdit(e) 在用户更改电子表格中的值时运行。

脚本执行和 API 请求不会导致触发器运行。例如,调用Range.setValue() 编辑单元格不会导致电子表格的onEdit 触发器运行。

考虑到以上情况,你想要的无法直接实现。

解决方法

在这种情况下,您可以做的是利用可安装的触发器并创建一个时间驱动的触发器。您可以创建一个脚本,该脚本将检查电子表格中与以前版本相比发生的任何更改。由于这必须由您以编程方式完成,因此这是一个更麻烦的绕过方式。

另一个选项(仍然使用时间驱动的触发器)是检查哪个是 HI 列中的最后一行(根据您的示例),并且还考虑到只有想要的值才会插入到这些列中。

参考

Apps Script Installable Triggers。

【讨论】:

我对这里的延误表示歉意!感谢您的解释并提供解决方法!

以上是关于如何在 Google Apps 脚本中添加和删除边框的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Apps 脚本将公式添加到 Google 表格?

如何在 Google Apps 脚本中向 UrlFetchApp 添加 API 密钥

使用 Google Apps 脚本删除 Gmail 电子邮件的附件

集成 Plaid 和 Google Apps 脚本

如何调试 Google Apps 脚本(又名 Logger.log 记录到哪里?)

Google 表单 - 使用 Google Apps 脚本在项目中添加自定义按钮“更多信息”