【问题标题】:How to count the number of cells which contain specific text using Google Sheet Scripts?如何使用 Google Sheet Scripts 计算包含特定文本的单元格数量?
【发布时间】:2020-02-18 16:12:48
【问题描述】:

如何使用谷歌表格脚本计算包含特定文本的单元格数量?

目前我正在使用以下脚本来计算包含特定文本的单元格的数量,例如包含“完成”或“未完成”的单元格。

function COUNT_TEXT_ACROSS_SHEETS(sheetNames, range, text) {
  sheetNames = sheetNames.split(',');
  var count = 0;
  sheetNames.forEach(function(sheetName) {
    var sheet = SpreadsheetApp.getActive().getSheetByName(sheetName);
    var values = sheet.getRange(range).getValues();
    values.forEach(function(row) {
      row.forEach(function(cell) {
        if (cell.indexOf(text) !== -1 ) count++;
      });
    });
  });
  return count;
};

目前脚本计算包含文本“完成”和“未完成”的两个单元格有没有办法修改脚本以仅计算包含完整单词“完成”而不是还计算包含“未完成”的单元格,因为该单元格还包含关键字:“完成”?

当前脚本的使用示例:

=COUNT_TEXT_ACROSS_SHEETS("Sheet1", "C1:C1000", "NOT COMPLETE")

【问题讨论】:

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


    【解决方案1】:

    使用TextFinder 类。

    示例脚本:

    /**
     * @customfunction
     * @return count of given text in spreadsheet
     * @param {string} text text to search
     * @param {boolean} mec whether to match entire cell
     * @param {boolean} mc whether to match case
     */
    function COUNT_SS(text = 'NOT COMPLETE', mec = true, mc = true) {
      return SpreadsheetApp.getActive()
        .createTextFinder(text)
        .matchEntireCell(mec)
        .matchCase(mc)
        .findAll()
        .length;
    }
    

    用法:

    =COUNT_SS()
    

    【讨论】:

    【解决方案2】:

    这个怎么样:

    function COUNT_TEXT_ACROSS_SHEETS(sheetNames, range, text) {//text=['Complete','Not Complete']
      var nA=sheetNames.split(',');
      var tA=text.split(',');
      var count = 0;
      var cObj={};
      cObj[tA[0]]=0;
      cObj[tA[1]]=0;
      nA.forEach(function(name) {
        var sh=SpreadsheetApp.getActive().getSheetByName(name);
        var vA = sheet.getRange(range).getValues();
        vA.forEach(function(r) {
          r.forEach(function(c) {
            var idx0=c.indexOf(tA[0]);
            var idx1=c.indexOf(tA[1]);
            if(idx0!=-1 && idx1==-1)cObj[tA[0]]+=1;
            if(idx0!=-1 && idx1!=-1)cObj[tA[1]]+=1  
          });
        });
      });
      return Utilities.formatString('Count-%s:%s Count-%s:%s',tA[0],cObj[tA[0]],tA[1],cObj[tA[1]]);
    };
    

    【讨论】:

    • 感谢您的信息。我只是继续并暂时添加了这个。 cObj[tA[0]]=0;cObj[tA[1]]=0;
    【解决方案3】:
    =COUNTIF(Sheet1!C1:C1000;"=NOT COMPLETE")
    

    【讨论】:

    • 嗨@user59892 感谢您的建议,但不幸的是它不起作用。
    • 不应引用范围。
    • 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多