如何根据两个不同列中的两个参数搜索和过滤Google表格

时间:2019-10-17 21:47:51

标签: javascript html google-apps-script google-sheets

我有一张46列的工作表,它将是无限量的行。我正在寻找一种使用简单UI生成Web应用程序的方法,该方法可以让我按两个条件进行搜索并筛选出不符合这些条件的所有结果。第一个是名称/ emp#搜索,分别位于第3列和第4列。另一个是日期搜索。我的想法是,我可以搜索该日期那个人的姓名或号码的所有实例,然后将其作为html表或类似的,等距且合理间隔的演示文稿返回。

下面是我目前正在尝试的代码。我的知识很有限,我想了解它的工作原理,因此,使其尽可能简单将是理想的。我已经能够使用TextFinder创建单一框搜索,但是听说这样做可能很慢,而且此工作表的潜力很大。我也想不出如何用另一个类别进一步过滤它。我尝试获取第一个文本查找器的结果,并通过另一个文本查找器运行它们,但这没有用。

code.gs

function doGet() {
  return HtmlService.createTemplateFromFile('index').evaluate();
}

function getValuesFromSS(search) {
  var ss = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1');
  var lastRow = ss.getLastRow();
  var range = ss.getRange(1,3,lastRow,2); //define range for column D
  var ranges = range.createTextFinder(search).findAll();
  var names = '';
  var nums = '';
  var dates = '';
  var urls = '';

  //loop through each range
  for (i = 0; i < ranges.length; i++) {

    var row = ranges[i].getRow();
    var lastCol = ss.getLastColumn();
    var values = ss.getRange(row, 1, 1, lastCol).getDisplayValues(); //get all values for the row
    var empname = values[0][2]; //column C
    var empnum = values[0][3];  //column D
    var date = values[0][4];  //column E
    var url = values[0][46];

    names+=Utilities.formatString("<td>" + empname + "</td>");
    nums+=Utilities.formatString("<td>" + empnum + "</td>");
    dates+=Utilities.formatString("<td>" + date + "</td>");
    urls+=Utilities.formatString("<td>" + "<a href='https://drive.google.com/uc?export=view&id='" + url + "'>DVIR</a>" + "</td>");
}

return {
  first: names,
  second: nums,
  third: dates,
  fourth: urls
}
}

index.html

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
  <script type="text/javascript">

    function setPageValues () {
    var search = document.getElementsByName('searchtext')[0].value;
      google.script.run.withSuccessHandler(disp).getValuesFromSS(search);
    }

    function disp(values){
      document.getElementById("results1").innerHTML = values.first;
      document.getElementById("results2").innerHTML = values.second;
      document.getElementById("results3").innerHTML = values.third;
      document.getElementById("results4").innerHTML = values.fourth;
    }
  </script>
</head>
<style>
table {
    border-collapse: collapse;
    }
tr { 
  display: block; 
  float: left; 
  }
td {
    border: 1px solid Black;
    display: block; 
    }
</style>
<body>
<input type="text" name="searchtext">
<input type="button" value="Search" onclick="setPageValues();">
<br>
<div name="resultbox">
<table>
<tr id="results1">
</tr>
<tr id="results2">
</tr>
<tr id="results3">
</tr>
<tr id="results4">
</tr>
</table>
</div>
</body>
<script>
</script>
</html>

这是示例电子表格链接: https://docs.google.com/spreadsheets/d/1scFOr4nUXwm7brvlMPHFJhyLei3TI-uvoOVugsx-TeA/edit?usp=sharing

正如我提到的,我想在一个框中搜索名称-or- emp#,在另一个框中搜索日期,并仅过滤匹配两者的结果以html显示。谢谢!

2 个答案:

答案 0 :(得分:1)

  • 您不仅要在电子表格中搜索“驱动程序名称”和“驱动程序编号”,还要搜索“日期”。
    • 在这种情况下,有时仅输入“驱动程序名称”或“驱动程序编号”。在某些情况下,仅输入“日期”。
  • 您想使用带有Google Apps脚本的Web Apps来实现这一目标。

如果我的理解正确,那么这个答案如何?请认为这只是几个答案之一。

修改点:

  • 在此修改中,日期输入标签已添加到HTML端。
  • 输入“驱动程序名称” /“驱动程序编号”和“日期”后,这些值将作为对象发送到Google Apps脚本侧。
  • 在Google Apps脚本中,这些值是使用TextFinder搜索的。
    • TextFinder的处理成本低于搜索每一行的成本。因此,我同时搜索了“驱动程序名称” /“驱动程序编号”和“日期”。

修改后的脚本:

修改脚本后,请进行以下修改。

HTML端:index.html

从:
function setPageValues () {
  var search = document.getElementsByName('searchtext')[0].value;
  google.script.run.withSuccessHandler(disp).getValuesFromSS(search);
}
至:
function setPageValues () {
  var search = document.getElementsByName('searchtext')[0].value;
  var date = document.getElementsByName('date')[0].value;
  var obj = {};
  if (!search && !date) alert("No search values.");
  if (search) {
    obj.name = search;
  }
  if (date) {
    obj.date = date;
  }
  google.script.run.withSuccessHandler(disp).getValuesFromSS(obj);
}

从:
<input type="text" name="searchtext">
<input type="button" value="Search" onclick="setPageValues();">
至:
<input type="text" name="searchtext">
<input type="date" name="date">
<input type="button" value="Search" onclick="setPageValues();">

Google Apps脚本方面:code.gs

从:
var range = ss.getRange(1,3,lastRow,2); //define range for column D
var ranges = range.createTextFinder(search).findAll();
至:
var ranges = [];
if ("name" in search && search.name != "") {
  ranges = ss.getRange(1, 3, lastRow, 2).createTextFinder(search.name).findAll();
}
if ("date" in search && search.date != "") {
  var dateRanges = ss.getRange(1, 5, lastRow, 1).createTextFinder(search.date).findAll();
  if (ranges.length > 0) {
    ranges = ranges.filter(function(r1) {return dateRanges.some(function(r2) {return r1.getRow() == r2.getRow()})});
  } else {
    ranges = dateRanges;
  }
}
  • 在这种情况下,运行Web Apps时,您可以看到2个输入标签。
    • 仅输入“驱动程序名称” /“驱动程序编号”时,将显示通过搜索“驱动程序名称” /“驱动程序编号”而检索到的值。
    • 仅输入“日期”时,将显示通过搜索“日期”而检索到的值。
    • 输入“驱动程序名称” /“驱动程序编号”和“日期”时,将显示通过搜索“驱动程序名称” /“驱动程序编号”和“日期”而检索到的值。

注意:

  • 在此修改后的脚本中,使用了共享的电子表格。请注意这一点。
  • 对于输出,使用了您当前的脚本和格式。

参考:

如果我误解了您的问题,而这不是您想要的方向,我深表歉意。

答案 1 :(得分:0)

使用查询功能可动态显示更改后的结果。

使用名称range1和名为range2的筛选器指南来运行查询选择。