google-apps-script - 如何使这个查询更有效或进入谷歌应用脚本?
问题描述
我正在寻找将列(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 App Scripts 实现这一点?任何帮助表示赞赏,谢谢!
解决方案
- 您想使用 Google Apps 脚本在您的问题中实现图像的结果。
如果我的理解是正确的,那么这个示例脚本怎么样?请认为这只是几个答案之一。该脚本的流程如下。
流动:
- 从电子表格中检索值。
- 创建一个对象。
- 这用于从 中搜索值
CategoryByKeywords
。
- 这用于从 中搜索值
- 使用对象创建结果数组。
- 在这里, 的值
MatchedCategory
是使用对象创建的。 indexOf
使用URL 的最后一段搜索关键字的值。
- 在这里, 的值
- 将结果数组放入电子表格。
- 在示例脚本中,这些值被放入“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);
}
笔记:
- 此脚本适用于您的共享电子表格。当您使用其他设计的电子表格时,此脚本可能会出现错误。请注意这一点。
参考:
我以为我会从你的这个问题中学习。所以我试着想出解决办法。如果我误解了您的问题并且这不是您想要的结果,我深表歉意。
推荐阅读
- r - 新手使用 R 研究赛马数据库
- python - 通过根据子编号在 csv 文件中的第三行每 2 行切片来创建百分比列
- r - 将环境中的特定元素列与 for 循环组合
- database - 在 MongoDB 中的结构元素上检查 $gt
- c# - Use enter key to send text to a rich text box
- ios - How to randomly generate user ID without login AWS
- r - 数据操作:根据变量选择用户
- tensorflow - Tensorflow keras fit - accuracy and loss both increasing drastically
- c++ - 删除第 I 个元素
- c - What is the purpose of using define macro inside enum in C?