pele 发表于 2024-12-6 15:31:42

使用formulaCondition过滤无效

本帖最后由 Wilson.Zhang 于 2024-12-9 09:00 编辑

产品:SpreadJS
版本:17.1.10
调研编号:SJS-27688
Last Review:2024-12-09
当前进展:非功能问题,设计使然。需使用绝对引用。

简单过滤需求:

字符长度大于2小于10

      sheet.setValue(0, 1, '名称', GC.Spread.Sheets.SheetArea.colHeader);
      sheet.setValue(0, 1, '中华人民共和国');
      sheet.setValue(1, 1, '工程');
      sheet.setValue(2, 1, '生产项目');
      sheet.setValue(3, 1, '科技人');
      sheet.setValue(4, 1, '生产');
      sheet.setValue(5, 1, '工程项目');
      sheet.setValue(6, 1, '数字化');



      var range = new GC.Spread.Sheets.Range(0, 1, 7, 1);
      sheet.rowFilter(new GC.Spread.Sheets.Filter.HideRowFilter(range));



            var nCondition = new GC.Spread.Sheets.ConditionalFormatting.Condition(
                GC.Spread.Sheets.ConditionalFormatting.ConditionType.formulaCondition,
                {
                  formula: "=AND(LENB(B1)>2, LENB(B1)<10)",
                  customValueType: GC.Spread.Sheets.ConditionalFormatting.CustomValueType.formula
                }
            );
            filter.addFilterItem(1, nCondition);
            filter.filter(1);
执行结果如下:

另外我想过滤字符长度大于2小于10,并且字符串中包含'工程',公式应该怎么写?
谢谢!




Wilson.Zhang 发表于 2024-12-6 15:31:43

本帖最后由 Wilson.Zhang 于 2024-12-9 09:25 编辑

您好!经调研,了解到SpreadJS在过滤器的公式中支持使用绝对引用和相对引用。您的公式”=AND(LENB(B1)>2, LENB(B1)<10)“中的单元格引用正是相对引用,公式中的相对引用B1被解析为基准行列,从过滤范围中获取值时将以此为基准偏移,即将偏移至C1执行过滤。如果您需要过滤B列数据,可以将您公式中的单元格引用调整为绝对引用,即”=AND(LENB($B1)>2, LENB($B1)<10)“。

对于您的整体过滤需求,可使用如下公式过滤:
=AND(AND(LEN($B1)>2, LEN($B1)<10), ISNUMBER(FIND("工程", $B1)))
如下动图所示,点击左上角的”Filter“按钮,将对B列数据按照长度大于2且小于10同时包含”工程“二字的文本进行过滤,筛选结果为”工程项目“。


另外,您可以参考官网文档了解单元格引用模式的细节:
https://demo.grapecity.com.cn/spreadjs/help/docs/formulareference/formulaoverview/cellreferences#%E7%9B%B8%E5%AF%B9%E5%92%8C%E7%BB%9D%E5%AF%B9

Wilson.Zhang 发表于 2024-12-6 16:51:41

本帖最后由 Wilson.Zhang 于 2024-12-6 16:56 编辑

您好!使用您提供的代码复现了问题,同时发现如果将公式中的单元格引用由B1修改为A1即可正常筛选。针对这个使用问题,调研后会及时向您同步结论,请您耐心等待,调研编号为SJS-27688。

您可以先参考上述使用方式使用,如果需要同时筛选包括“工程”二字的条目,可以再叠加一个AND条件语句,参考如下代码:
var nCondition = new GC.Spread.Sheets.ConditionalFormatting.Condition(
    GC.Spread.Sheets.ConditionalFormatting.ConditionType.formulaCondition,
    {
      formula: '=AND(AND(LEN(A1)>2, LEN(A1)<10), ISNUMBER(FIND("工程", A1)))',
      customValueType: GC.Spread.Sheets.ConditionalFormatting.CustomValueType.formula
   }
);

pele 发表于 2024-12-9 10:00:09

Wilson.Zhang 发表于 2024-12-9 08:59
您好!经调研,了解到SpreadJS在过滤器的公式中支持使用绝对引用和相对引用。您的公式”=AND(LENB(B1)>2, L ...

解释的很清晰,问题解决,非常感谢!

Joestar.Xu 发表于 2024-12-9 10:21:26

好的,那就先结贴了,后续有其他问题的话随时开新帖提问哈。

Wilson.Zhang 发表于 2024-12-9 17:17:16

pele 发表于 2024-12-9 10:00
解释的很清晰,问题解决,非常感谢!
不客气。如有新问题,欢迎发新帖沟通。
:mj72:
页: [1]
查看完整版本: 使用formulaCondition过滤无效