我添加了一个功能
levenshteinDistanceDP(string1,string2)
作为 AppScript 中的自定义函数。它返回一个整数。另外,我在工作表中有查询:
QUERY(Expenses!A1:H;"SELECT A, B, C, D WHERE LOWER(H) contains LOWER("""&K3&""") ";1)
作为“WHERE LOWER(H) contains LOWER("""&K3&""")"的补充,我想包含levenshteinDistanceDP(lower(H),Lower(K3))小于3的结果。
我想会有一种方法,通过向使用自定义函数的“费用”添加一列,并且查询仅检查该列。如果可能的话,我想在查询中完成它。有什么想法吗?
编辑:额外列的想法特别不合适,因为自定义函数在每行中加载大约需要一秒钟。对于几千行是不可行的,因为 K3 可以根据用户(我)的意愿更新,然后每次都会重新计算。我想这个事实可能会危及整个想法,但也许它在查询中运行得更快一些。将其包含在查询中的另一个原因。
最佳答案
在查询中,您无法选择应用编辑距离公式。我建议使其更加可行的是不要将您的函数用作单元格内的自定义函数,而是使其使用 onEdit 计算一次。
function onEdit(e){
var sh = e.source.getActiveSheet()
var shname = e.range.getSheet().getName()
var column = e.range.getColumn()
var row = e.range.getRow()
var range = e.range
if(shname == "Expenses"){
if(range.getA1Notation() == "K3"){
var rangewords = sh.getRange("H:H")
var words = rangewords.getValues()
for(i=0;i<words.length;i++){
if(words[i]=="" || words[i]==null) {return}
else {sh.getRange(i+1,10).setValue(levenshteinDistanceDP(words[i].toString().toLowerCase(),range.getValue().toString().toLowerCase()))} //change 10 with the number of column you desire to use as auxiliar for this
}
}
else if(column == 8){
sheet.getRange(row,10).setValue(levenshteinDistanceDP(range.getValue().toString().toLowerCase(),sh.getRange("K3").getValue()].toString().toLowerCase())) //change 10 with the number of column you desire to use as auxiliar for this}
}
}
}
当您更改 K3 时,它会重新计算所有列一次,当您更改 H 列中的值时,它只会计算该行一次。尝试一下并告诉我。如有必要,您可以共享包含要调试的函数的示例文件
关于sql - Google 表格查询中的 Levenshtein 距离/自定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75579701/