gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:32:01 26 4
gpt4 key购买 nike

我有一个包含 46 列的工作表,行数不定。我正在寻找一种方法来生成具有简单 UI 的 Web 应用程序,让我可以按两个标准进行搜索并过滤掉所有不符合这些标准的结果。第一个是 name/emp# 搜索,分别位于第 3 列和第 4 列。另一个是日期搜索。我的想法是,我可以搜索那个人的名字或号码在那个日期的所有实例,并将其作为 html 表格或一些同样均匀且间隔合理的演示文稿返回。

下面是我目前试验过的代码。我的知识非常有限,我想了解它是如何工作的,所以让它尽可能简单是理想的。我已经能够使用 TextFinder 创建单框搜索,但我听说这可能很慢,而且这张表可能会很大。我也不知道如何用另一个类别进一步过滤它。我试过获取第一个文本查找器的结果并通过另一个文本查找器运行它们,但这没有用。

代码.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

如前所述,我想在一个框中搜索名称 - 或 - emp#,在另一个框中搜索日期,然后仅过滤与两者匹配的结果以 html 格式显示。谢谢!

最佳答案

  • 您不仅要在电子表格中搜索“司机姓名”和“司机编号”,还要搜索“日期”。
    • 在这种情况下,有时只输入“司机姓名”或“司机编号”。也有只输入“日期”的情况。
  • 您想使用带有 Google Apps 脚本的网络应用程序来实现这一目标。

如果我的理解是正确的,这个答案怎么样?请将此视为几个答案之一。

修改点:

  • 在本次修改中,date-input 标签被添加到 HTML 端。
  • 输入“司机姓名”/“司机编号”和“日期”后,这些值将作为对象发送到 Google Apps 脚本端。
  • 在 Google Apps Script 中,这些值是使用 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;
}
}
  • 在这种情况下,当网络应用程序运行时,您可以看到 2 个输入标签。
    • 当您仅输入“司机姓名”/“司机编号”时,将显示通过搜索“司机姓名”/“司机编号”检索到的值。
    • 当您仅输入“日期”时,将显示通过搜索“日期”检索到的值。
    • 当您输入“司机姓名”/“司机编号”和“日期”时,将显示通过搜索“司机姓名”/“司机编号”和“日期”检索到的值。

注意事项:

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

引用:

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

关于javascript - 如何根据两个不同列中的两个参数搜索和过滤 Google 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58441131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com