【问题标题】:How to make this query more efficient or into a google app script?如何使这个查询更有效或进入谷歌应用脚​​本?
【发布时间】:2019-09-07 04:48:34
【问题描述】:

我希望将列(A、B、C)中的关键字列表和分类(D 列)每个链接与关键字列表中找到的字符串进行匹配。

  • 将链接字符串与关键字列表匹配以进行分类
  • 如果类别有 2 个关键字,则两个关键字必须匹配才能进行分类
  • 文章单词分隔符将始终为“-”

我认为谷歌应用脚​​本最好是对其进行有效分类。

这是电子表格:https://docs.google.com/spreadsheets/d/1W4VAqUDVdJ6EJqzhkMlYRnUOSSM-kdhj3MfuZsu17qM/edit#gid=0

到目前为止,我有这个公式有时会起作用,但速度慢且不一致:

=ARRAYFORMULA(IFERROR(REGEXEXTRACT(
 IFERROR(VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,1), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0))&
 IFERROR(VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,2), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0))&
 IFERROR(VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,3), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0)), 
 TEXTJOIN("|", 1, UNIQUE(IFERROR({
 VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,1), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0);
 VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,2), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0);
 VLOOKUP(INDEX(IFERROR(REGEXEXTRACT(IFERROR(SPLIT(H2:H, "-")), 
 TEXTJOIN("|", 1, A2:C))),,3), {{A2:A;B2:B;C2:C},{D2:D;D2:D;D2:D}}, 2, 0)}))))))

如何使用 Google 应用脚本实现这一点?任何帮助表示赞赏,谢谢!

【问题讨论】:

    标签: google-apps-script google-sheets


    【解决方案1】:

    不是数组公式,但我相信这样会更快:

    I2:

    =TEXTJOIN(",",1,QUERY(A:D,"Select D where A is not null "&JOIN(" and '"&H2&"' contains "," ","A" ,"B"," C"), 0))
    
    • QUERY检查H是否包含A、B、C并返回对应的D。
    • TEXTJOIN 加入结果,如果存在多个。

    向下拖动

    【讨论】:

    • 哇,这么漂亮的解决方案,来自我所拥有的
    • 对于编辑,想知道为什么连续有 2 个逗号? contains "," ","
    • @sojim Join 通常介于两者之间。如果我加入and,我会得到A and B and C。我(查询)想要and A and B and C。小修改..不会有太大的不同。别担心
    【解决方案2】:
    • 您想使用 Google Apps 脚本在您的问题中实现图像的结果。

    如果我的理解是正确的,那么这个示例脚本怎么样?请认为这只是几个答案之一。该脚本的流程如下。

    流程:

    1. 从电子表格中检索值。
    2. 创建一个对象。
      • 这用于从CategoryByKeywords 中搜索值。
    3. 使用对象创建结果数组。
      • 这里,MatchedCategory 的值是使用对象创建的。
      • 使用 URL 的最后一段中的 indexOf 搜索关键字的值。
    4. 将结果数组放入电子表格。
      • 在示例脚本中,值被放入“K”列。

    示例脚本:

    使用此脚本时,请将脚本复制粘贴到共享电子表格的脚本编辑器中,然后运行myFunction()的功能。

    function myFunction() {
      // Retrieve values from Spreadsheet.
      var sheet = SpreadsheetApp.getActiveSheet();
      var values = sheet.getRange("A2:H" + sheet.getLastRow()).getValues();
    
      // Create an object.
      var obj = values.reduce(function(o1, e, i) {
        var p = e.splice(-1)[0].split("/").splice(-1)[0];
        if (p) o1.params.push(p);
        var v = e.splice(0, 4);
        var k = v.splice(-1);
        if (k[0]) {
          var obj = {};
          obj[k[0]] = v.filter(String);
          o1.values.push(obj);
        }
        return o1;
      }, {params: [], values: []});
    
      // Create the result array using the object.
      var res = obj.params.map(function(e) {
        return obj.values.reduce(function(ar, f, j) {
          var key = Object.keys(f)[0];
          if (f[key].every(function(g) {return e.indexOf(g) > -1})) ar.push(key);
          if (j == obj.values.length - 1 && ar.length == 0) {
            ar.push("");
          } else if (ar.length > 1) {
            ar = [ar.join(",")];
          }
          return ar;
        }, []);
      });
    
      // Put the result array to the column "K".
      sheet.getRange(2, 11, res.length, 1).setValues(res);
    }
    

    注意:

    • 此脚本适用于您的共享电子表格。当您使用其他设计的电子表格时,此脚本可能会出现错误。请注意这一点。

    参考资料:

    我以为我会从你的这个问题中学习。所以我试着想出解决办法。如果我误解了您的问题并且这不是您想要的结果,我深表歉意。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      相关资源
      最近更新 更多