【问题标题】:Google Spreadsheets API - Conditional Formatting based on range and adjacent valuesGoogle Spreadsheets API - 基于范围和相邻值的条件格式
【发布时间】:2019-05-03 09:21:16
【问题描述】:

我有以下非常精简的电子表格版本:

Sect   | Lbl    | A      | B       | C       | D       | E
==========================================================
Sec1   | Lbl1   | 1      | 8       | 6       | 10      |
----------------------------------------------------------
Sec2   | Lbl2   | 2      | 1       | 1       | >100    |
----------------------------------------------------------
etc...

我想在所有值上应用一个规则/规则说:

Bg 颜色 = 绿色,如果: - 右边的单元格不是空白的并且高于这个值

Bg 颜色 = 红色,如果: - 右边的单元格不是空白的并且小于这个值

Bg 颜色 = 白色(无动作)如果: - 右边的单元格具有相同的值

此外,如果该值设置为非数字“>100”,我需要将其转换为 100 作为此格式的一部分。

我正在使用 C# 通过电子表格 v4 API 来执行此操作。 到目前为止,我有下面的代码,但我不确定如何将多个条件应用于格式化规则。

更新

在阅读下文之前,请注意上面更新的表格示例

感谢 TheMaster,我已经启动并运行了一些东西,但还不是很正确。我还有一个额外的因素:

  • 第一行应从条件格式中排除
  • 前两列是标签,也应该被忽略/排除
  • 需要将所有其他列和数据行与其右侧的列(如果可用)进行比较并相应地着色。

到目前为止,这是我用于 Red 规则 (where cell value > cell value to the right) 的代码。 除此之外,我还有一个Green 规则(where cell value < cell value to the right)和一个White 规则(where cell value = cell value to the right

它们在批量更新请求中被索引如下: 0 = 红色 1 = 绿色 2 = 白色

Red 规则的代码:

formatRequest.Requests.Add(new Google.Apis.Sheets.v4.Data.Request()
          {
              AddConditionalFormatRule = new AddConditionalFormatRuleRequest()
              {
                  Rule = new ConditionalFormatRule()
                  {
                      BooleanRule = new BooleanRule()
                      {
                          Condition = new BooleanCondition()
                          {
                              Type = "CUSTOM_FORMULA",
                              Values = new List<ConditionValue>() {
                                  new ConditionValue()
                                  {
                                      UserEnteredValue = "=AND(NOT(ISBLANK(A2)),(1*REGEXEXTRACT(A2,\"\\d+\"))>(1*REGEXEXTRACT(B2,\"\\d+\")))"
                                  }
                              }
                          },
                           Format = new CellFormat()
                           {
                               BackgroundColor = new Color()
                               {
                                   Red = 0.8f,
                                   Green = 0f,
                                   Blue = 0f,
                                   Alpha = 1f
                               }
                           }
                      },
                      Ranges =  new List<GridRange>()
                      {
                          new GridRange()
                          {
                              SheetId = Convert.ToInt32(sheetId)
                              ,StartRowIndex = 1
                          },
                      }
                   },
                  Index = 0
              }
          });

问题是它没有将条件格式应用于整个工作表...仅第一列数据。

【问题讨论】:

  • 查看gs-conditional-formatting中投票最多的问题。
  • 默认为白色。您不必添加白色条件格式,除非您更改了默认值。

标签: asp.net-core google-sheets google-sheets-api google-api-dotnet-client gs-conditional-formatting


【解决方案1】:
  • 您应该使用CUSTOM_FORMULA 作为布尔条件类型
  • 您需要使用index 0 和1 添加两个条件格式规则
  • 范围将是开放式的并覆盖整张纸。

片段(A1:Z;Bg:red):

  • 布尔条件 JSON:
{ 
  "type": "CUSTOM_FORMULA",
  "values": [
    {
      userEnteredValue: "=AND(NOT(ISBLANK(A1)),A1>(IF(ISNUMBER(B1),B1,1*REGEXEXTRACT(B1,\"\d+\"))))"
    }
  ]
}
  • BooleanRule/Format/BackgroundColor JSON:
{
  "red": 1,
  "green": 0,
  "blue": 0,
  "alpha": 1
}

【讨论】:

  • 感谢您的帮助。它让我走得更远,但我正在努力让它完全按照我的需要工作。如果您有机会将您的博学之眼投向它,我在上面添加了更多信息和示例!
  • 我尝试过使用 startColumnIndex 但似乎没有什么不同。
  • @scgough 尝试添加endRowIndex。你能告诉我条件格式在表格屏幕截图中的外观吗? Apply to: 必须是 C2:Z 并且公式应该引用该范围内的左上角单元格,即 C2
  • 应用到:C2:Z1000 (steamlined) 红色公式:=AND((1*REGEXEXTRACT(D2,"\d+"))&lt;(1*REGEXEXTRACT(C2,"\d+"))) 这将正确格式化左侧最新列。但是,如果我在数据的 LHS 中添加一个新列(即现在填充了 C、D 和 E 列),格式仍然只应用于原始列(现在 D)。 C 中的新列数据未格式化。
  • @scgough 这应该是一个新问题。但是,这是意料之中的,因为格式最初应用于原始 C 列,而不是新的 C 列。您可以尝试从 B 列应用格式。这样,当您在 B 和 C 之间插入新列时,它仍然在范围内。
猜你喜欢
  • 2018-06-04
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 1970-01-01
  • 2020-07-07
  • 2011-11-15
相关资源
最近更新 更多