首页 > 解决方案 > 如何使这个查询更有效或进入谷歌应用脚​​本?

问题描述

我正在寻找将列(A、B、C)和分类(D 列)中的关键字列表与关键字列表中找到的字符串进行匹配。

我认为谷歌应用程序脚本最好能有效地对其进行分类。

这是电子表格: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 App Scripts 实现这一点?任何帮助表示赞赏,谢谢!

标签: google-apps-scriptgoogle-sheets

解决方案


  • 您想使用 Google Apps 脚本在您的问题中实现图像的结果。

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

流动:

  1. 从电子表格中检索值。
  2. 创建一个对象。
    • 这用于从 中搜索值CategoryByKeywords
  3. 使用对象创建结果数组。
    • 在这里, 的值MatchedCategory是使用对象创建的。
    • indexOf使用URL 的最后一段搜索关键字的值。
  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);
}

笔记:

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

参考:

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


推荐阅读