【问题标题】:How to count the number of characters before a certain word appearing several times in a cell in Google Sheets?如何计算某个单词在Google表格中的单元格中多次出现之前的字符数?
【发布时间】:2019-06-19 08:38:42
【问题描述】:

按照此处提供的解决方案,我找到了以下公式来计算某个单词之前的字符数:

Count number of characters before a certain word in cell

=SEARCH("apple",A2)-1

我的问题如下:

如何计算单个单元格中相同单词出现两次之间的中间字符?

改编妮可的例子找到here):

“我需要在一个单词之前计算文本字符串中的字符数。例如,假设单词是“Apple”。文本字符串是“我从那棵美丽的树上摘下一个苹果” . 在这种情况下,字符数是 13。"

假设我的例子是:

“我从红色的apple 树上采摘了一棵apple”。

=SEARCH("apple",A2)-1 公式返回字符数,直到单词“apple”第一次出现为止。应该是 13。

如何用脚本计算单词“apple”出现两次之间的字符数?

, from the red”的长度是多少?

或者是否可以通过修改公式=SEARCH("apple",A2)-1来做到这一点?

非常感谢您的帮助和指导!

【问题讨论】:

    标签: google-apps-script google-sheets google-sheets-formula


    【解决方案1】:

    搜索函数可以采用第三个参数,即您要在字符串中的哪个位置开始搜索,因此如果您找到“apple”的第一个实例,然后从该位置加 1 开始运行另一个搜索,您会发现第二个例子。

    一审:

    =search("apple", A2)
    

    第二次:

    =search("apple", A2, search("apple", A2) + 1)
    

    从第一个中减去第二个:

    =search("apple", A2, search("apple", A2) + 1) - search("apple", A2)
    

    要获得两者之间的长度,您必须减去单词“apple”或您要搜索的任何内容的长度。

    【讨论】:

    • 嗨@Aidan!非常感谢您的回答。我终于理解了使用第二次搜索的嵌入方式,从第一次搜索右侧的第一个位置开始的第二个参数。然后减去第一次搜索的位置。最后将第1次查找的第2个字符减去第1次查找的最后一个字符的字符数,也减去第2次查找的第1个字符。这是我在 Sheet2 上的测试:Sheet2 很好!
    【解决方案2】:

    如果你想用脚本来做,你可以玩“indexOf”函数。它计算从字符串开头到您介绍的单词有多少个字符。 indexOf 像这样工作:

    indexOf(string, [pos])
    

    如果你不指定任何位置,它将从头开始,否则从你介绍的位置开始计算。 话虽如此,您可以应用以下逻辑:

    var string = sheet.getRange("your cell").getValues().toString();
    
    var apple_length = "apple".length;  
    var first_apple = string.indexOf("apple") + apple_length;
    var second_apple = string.indexOf("apple", first_apple);
    
    var result = second_apple - first_apple;
    

    由于它会一直计数直到找到单词,所以我们需要将单词的长度添加到公式中,并将该结果用作第二个 indexOf 的起始位置。

    欲了解更多信息,请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf

    编辑

    var appletree = [];
    var apple_length = "apple".length;
    var char_counter = 0;
    
    while (true) {
    
    var apple = your_string.indexOf("apple", char_counter) + apple_length;
    
    appletree.push(apple);
    
    char_counter = char_counter + apple;
    
    
    if (char_counter >= your_string.length) 
     break;
    
    };
    };
    

    这实际上更简单更好,因为它与字符串长度或放置多少苹果无关。

    【讨论】:

    • 嗨@Jescanellas!也感谢您的解决方案!我将对其进行测试并返回我的结果。快说吧!
    • 你好@Jescanellas!我在这里改编了你的脚本的工作版本:JescanellasScript。再次感谢,它适用于 2 次“苹果”。
    • 这里是表格Sheet4
    • 我查阅了您共享的文档并尝试扩展代码以适应 3 次出现的“apple”。但由于“apple”的出现是数组中不分青红皂白的字符串,以源代码indexOf 为例,我看不出如何使它适用于超过 2 次出现。
    • 我尝试了以下 2 个测试,但它不起作用:1st test,2nd test。你对如何使它工作超过 2 次有更多的想法吗?再次非常感谢!保重!
    【解决方案3】:
    =INDEX(LEN(SPLIT($A$1,"apple",0)))
    
    • SPLITapple发文
    • 计算每个字符串的LENgth
    • INDEX获取数组中的相应索引

      =INDEX(LEN(SPLIT($A$1,"apple",0)),2)
      

    var str = "I plucked an apple, from the red apple tree";
    var len = str.split('apple', 2).map(e=>e.length);
    console.info(len);
    console.info(len[1]);

    【讨论】:

    • 嗨@TheMaster!很高兴收到您的回复!我会做测试并尽快回复!快说吧。
    • 很棒的代码@TheMaster!通过简单地更新索引号,它也可以很好地轻松地出现 2 次以上!这里是 3 次“苹果”的演示:Sheet3 非常感谢!解决它的好方法!
    • @Lod 请注意,第一个公式是在没有指定索引行号的情况下编写的,以返回所有结果。
    • 嗨@TheMaster!感谢有关行的通知。我已经使用 0 作为行索引测试了 INDEX(如 INDEX documentation 中所述,它将返回所有值)。它确实在右侧的单独单元格中返回所有结果。在Sheet3 cell B27 中使用此代码=INDEX(LEN(SPLIT($A27,"apple",0)),0)。这对于以同一单元格结尾的所有字符串/句子都有效。
    • 感谢提醒!我忘了接受那个。我会尽快检查我的其他旧问题,以防我忘记了其他问题。身体健康!
    【解决方案4】:
    =FINDB("♥", SUBSTITUTE(A1, "apple", "♥"))-1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-05
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2020-07-31
      相关资源
      最近更新 更多