sql - Google 表格查询中的 Levenshtein 距离/自定义函数

标签 sql google-apps-script google-sheets levenshtein-distance

我添加了一个功能 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/

相关文章:

php - 从多个表中获取图像

google-apps-script - 触发 Gmail 的报告网络钓鱼功能

regex - 使用正则表达式消除谷歌应用程序脚本中的换行符

javascript - 如果某行在 Google 表格中标记为绿色后 15 分钟内出现绿色背景,则删除该行

mysql - 按字母顺序显示查询

sql - 了解涉及 3 个或更多表时 JOIN 的工作原理。 [SQL]

mysql - 从同一个表中双向选择记录?

javascript - 根据条件获取第一个和最后一个数组

google-sheets - 在 Google 电子表格中使用合并单元格执行查找

javascript - Google Sheets 脚本错误 - 无法将数组转换为对象[][]