Google apps script Google工作表中的边框条件格式(满足多个条件)

Google apps script Google工作表中的边框条件格式(满足多个条件),google-apps-script,google-sheets,conditional-formatting,Google Apps Script,Google Sheets,Conditional Formatting,更新:解决方案是简单地在EXCEL中创建它(确保所有公式与工作表兼容),然后上传并将其从xls转换为工作表格式 我在谷歌表单中有一个时间表,需要根据课程是否在这段时间内发生而改变边界 它需要在OneEdit上触发,以便随着电子表格的更改,边框更新。我需要在每个触发器的开始处删除边界,我从另一个已回答的问题中得到了以下代码: function RemoveBorders() { var ss = SpreadsheetApp.getActiveSpreadsheet(); var shee

更新:解决方案是简单地在EXCEL中创建它(确保所有公式与工作表兼容),然后上传并将其从xls转换为工作表格式

我在谷歌表单中有一个时间表,需要根据课程是否在这段时间内发生而改变边界

它需要在OneEdit上触发,以便随着电子表格的更改,边框更新。我需要在每个触发器的开始处删除边界,我从另一个已回答的问题中得到了以下代码:

    function RemoveBorders() {
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var cell = sheet.getRange("C5:G29");

cell.setBorder(false, false, false, false, false, false, "black", SpreadsheetApp.BorderStyle.solid);
}
这方面的一个例子可以在“我需要每个类都被装箱”中找到(任何不涉及类的单元格都需要保留它们的边框)

背景的条件格式是使用这个公式完成的,效果非常好

=SUMPRODUCT(($B5>=($L$5:$L)),(C$4=($K$5:$K)),($B5<($M$5:$M)))>=1     
规则2:对于类的“中间单元格”,如果单元格位于当天有类的时间表列中,且单元格的时间段(9:00-9:30)大于或等于类开始时间值,且单元格的时间段小于类结束时间值,则在左侧和右侧添加边框

这是我完成整个动态数据导入和操作的最后一步,动态更新单个教师的时间表。我已经搜索、搜索和查找了这么多东西,但我一直在以脚本形式解决这个问题。任何帮助都将不胜感激

编辑: 作为所有这些的新手,我一直在努力让事情顺利进行。在这个过程中,我偶然发现了一些其他问题的答案,并将这些代码拼凑在一起,这些代码至少略微描述了类,尽管这不是完美的解决方案

    function onEdit() {
var sheet = SpreadsheetApp.getActiveSheet();
   var range = sheet.getRange("C5:g30");
  var adress= range.getA1Notation();
  Logger.log("changed cell %s", adress);
  sheet.getRange('F2').setValue(adress);


  // Remove all borders
  var range = sheet.getRange("c5:g30");
  range.setBorder(true, true, true, true, true, true,"#D3D3D3",SpreadsheetApp.BorderStyle.SOLID);


//addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      Logger.log("changed cell %s", range.getCell(i,j).getA1Notation() );
      if(currentValue != "") {
        Logger.log("positive on %s", range.getCell(i,j).getA1Notation());
        range.getCell(i,j).setBorder(true, null, null, null, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }
    }
  }
}
函数onEdit(){
var sheet=SpreadsheetApp.getActiveSheet();
var范围=sheet.getRange(“C5:g30”);
var address=range.getA1Notation();
Logger.log(“已更改单元格%s”,地址);
表.getRange('F2')。设置值(地址);
//删除所有边界
var范围=sheet.getRange(“c5:g30”);
范围.设置顺序(真,真,真,真,真,真,“#d3d3”,电子表格应用程序.BorderStyle.SOLID);
//添加顶行
var numRows=range.getNumRows();
var numCols=range.getNumColumns();
对于(var i=1;我的问题:
如何向具有多个条件的单元格添加边框

由此:

为此:

答复: 测试此代码段并使其适应您的需要:

function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("C5:g29");
  var adress = range.getA1Notation();
  sheet.getRange('F2').setValue(adress);

  // Remove all borders
  var range = sheet.getRange("c5:g29");
  range.setBorder(true, true, true, true, true, true, "#D3D3D3", SpreadsheetApp.BorderStyle.SOLID);

  //addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var row = 1; row <= numRows; row++) {
    for (var column = 1; column <= numCols; column++) {

      var currentValue = range.getCell(row, column).getValue();
      // setBorder(top, left, bottom, right, vertical, horizontal, color, style)
      if ( (currentValue != "" && range.getCell(row+2, column).getValue() != "" ) || (currentValue != "" && range.getCell(row-2, column).getValue() != "" )) {
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      } else if (currentValue != ""){
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+2, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+3, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }

    }
  }
}
功能测试(){
var sheet=SpreadsheetApp.getActiveSheet();
var范围=sheet.getRange(“C5:g29”);
var address=range.getA1Notation();
表.getRange('F2')。设置值(地址);
//删除所有边界
var范围=sheet.getRange(“c5:g29”);
范围.设置顺序(真,真,真,真,真,真,“#d3d3”,电子表格应用程序.BorderStyle.SOLID);
//添加顶行
var numRows=range.getNumRows();
var numCols=range.getNumColumns();

对于(var row=1;row您可以用图像显示预期结果吗?例如,如果我更改单元格D20,则会发生这种情况(带格式的图像)。因为现在很难理解。很抱歉造成混淆。我在原始帖子中共享的链接中添加了一个选项卡,显示了我所需的格式。基本上,我需要检查每个单元格的三种情况。1.它是否在类的开始时间?(左、右和顶部的边框)2.它是否在“中间”类的时间(单元格不是开始时间或结束时间,但在类发生的时间内)?(添加左边框和右边框)3.或在类的结束时间?(添加左边框、右边框和下边框)我现在理解你了:)让我为您创建一个工作示例。感谢您的帮助。当我更改类的时间时,我遇到了一个问题:它似乎无法准确定位新的类范围(Iy似乎为每个类创建了四行(两小时周期)的边界)。我现在不在工作站上,因此我将不得不等待在更大的屏幕上进行调查。我感谢您在这第一步提供的帮助!真正的解决方案是在excel中使用边界条件格式设置时间表。然后将excel文件上载到Google Sheets,在Google Sheets中打开并从m xls转换为工作表格式。只需确保任何excel公式在工作表中也兼容(我的SUMPRODUCTS是在条件之间用*,而不是用“,”计算的)。再次感谢您的时间和帮助!这里是工作链接:
=SUMPRODUCT((C$4=($K$5:$K)),($B5=($M$5:$M)))>=1
    function onEdit() {
var sheet = SpreadsheetApp.getActiveSheet();
   var range = sheet.getRange("C5:g30");
  var adress= range.getA1Notation();
  Logger.log("changed cell %s", adress);
  sheet.getRange('F2').setValue(adress);


  // Remove all borders
  var range = sheet.getRange("c5:g30");
  range.setBorder(true, true, true, true, true, true,"#D3D3D3",SpreadsheetApp.BorderStyle.SOLID);


//addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var i = 1; i <= numRows; i++) {
    for (var j = 1; j <= numCols; j++) {
      var currentValue = range.getCell(i,j).getValue();
      Logger.log("changed cell %s", range.getCell(i,j).getA1Notation() );
      if(currentValue != "") {
        Logger.log("positive on %s", range.getCell(i,j).getA1Notation());
        range.getCell(i,j).setBorder(true, null, null, null, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }
    }
  }
}
function test() {
  var sheet = SpreadsheetApp.getActiveSheet();
  var range = sheet.getRange("C5:g29");
  var adress = range.getA1Notation();
  sheet.getRange('F2').setValue(adress);

  // Remove all borders
  var range = sheet.getRange("c5:g29");
  range.setBorder(true, true, true, true, true, true, "#D3D3D3", SpreadsheetApp.BorderStyle.SOLID);

  //addtop rows
  var numRows = range.getNumRows();
  var numCols = range.getNumColumns();
  for (var row = 1; row <= numRows; row++) {
    for (var column = 1; column <= numCols; column++) {

      var currentValue = range.getCell(row, column).getValue();
      // setBorder(top, left, bottom, right, vertical, horizontal, color, style)
      if ( (currentValue != "" && range.getCell(row+2, column).getValue() != "" ) || (currentValue != "" && range.getCell(row-2, column).getValue() != "" )) {
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      } else if (currentValue != ""){
        range.getCell(row, column).setBorder(true, true, null, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+1, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+2, column).setBorder(false, true, false, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
        range.getCell(row+3, column).setBorder(false, true, true, true, null, null, "black", SpreadsheetApp.BorderStyle.SOLID_MEDIUM);
      }

    }
  }
}