javascript - 需要从 GAS Web 应用程序上的先前条目中检索特定数量的数据
问题描述
类似于我之前提出的问题(检查登录用户名和密码,然后从之前的每个条目中获取数据)。
我创建了一个网络应用程序来跟踪我公司员工的工作时间,网络应用程序很简单,它首先要求他们提供用户名和密码,然后允许他们注册他们的进入时间或退出时间。现在,我需要找到一种方法来检查用户名和密码之间的匹配(在数据库中),如果这是真的,请将有关员工之前输入的最后 10 个条目的信息带到 Web 应用程序中,而不是检索员工所做的所有这些以前的条目,有关以前条目的数据都可以在从网络应用程序接收数据的谷歌表上找到。
这是一个最小的可重现示例,它只要求输入名称和密码,如果为真,则显示另一个显示,它首先要求输入日期和时间,然后是该人之前输入的每个条目,但我现在需要它带来员工所做的最后 10 个条目。
function doGet(e) {
return HtmlService.createHtmlOutputFromFile('Form');
}
function AddRecord(Name, Date, Time) {
// get spreadsheet details
var url = 'https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0';
//Paste URL of GOOGLE SHEET
var ss1= SpreadsheetApp.openByUrl(url);
var webAppSheet1 = ss1.getActiveSheet();
const Lrow = webAppSheet1.getLastRow();
const data = [Name, Date, Time];
webAppSheet1.getRange(Lrow+1,1, 1, data.length).setValues([data])
}
function checklogin(Name,Password) {
var url = 'https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0'; //Paste URL of GOOGLE SHEET
var ss2= SpreadsheetApp.openByUrl(url);
var webAppSheet2 = ss2.getSheetByName("DataBase");
var checkuser = webAppSheet2.getRange(2, 1, webAppSheet2.getLastRow(), 1).createTextFinder(Name).matchEntireCell(true).findNext();
var obj = {checkuser: checkuser && checkuser.offset(0, 1).getValue() == Password ? 'TRUE' : 'FALSE'};
var sheet = ss2.getSheetByName("ReceivedData");
var ranges = sheet.getRange(2, 1, sheet.getLastRow(), 1).createTextFinder(Name).matchEntireCell(true).findAll();
if (ranges.length > 0) {
obj.dateTime = ranges.flatMap(r => r.offset(0, 1, 1, 2).getDisplayValues());
return obj;
}
return obj;
}
<!DOCTYPE html>
<html>
<head>
<base target="_top">
<style>
</style>
<script>
function AddRow()
{
var Name = document.getElementById("Name").value;
var Date = document.getElementById("Date").value;
var Time = document.getElementById("Time").value;
google.script.run.AddRecord(Name, Date, Time);
document.getElementById("Name").value = '';
document.getElementById("Date").value = '';
document.getElementById("Time").value = '';
}
function LoginUser() {
var Name = document.getElementById("Name").value;
var Password = document.getElementById("Password").value;
google.script.run.withSuccessHandler(function({checkuser, dateTime}) {
if(checkuser == 'TRUE') {
document.getElementById("loginDisplay").style.display = "none";
document.getElementById("dataDisplay").style.display = "block";
document.getElementById("dateTime").innerHTML = dateTime.map(([a, b]) => `${b} || ${a}`).join("<br>");
} else if(checkuser == 'FALSE') {
document.getElementById("errorMessage").innerHTML = "Name not found";
}
}).checklogin(Name,Password);
}
</script>
</head>
<body>
<div id="loginDisplay">
<div>
<label>Name</label><br>
<input type="text" id="Name" />
</div>
<div>
<label>Password</label><br>
<input type="text" id="Password" />
</div>
<div>
<input value="Login" onclick="LoginUser()"type="button">
<span id="errorMessage"></span>
</div>
</div>
<div style="display:none" id="dataDisplay">
<div>
<label>Date</label><br>
<input type="date" id="Date" />
</div>
<div>
<label>Time</label><br>
<input type="time" id="Time" />
</div>
<div>
<button type="button" value="Add" onclick="AddRow()">Send</button>
</div>
<div>
<br><label>Last Registration</label><br>
<span id="dateTime"></span>
</div>
</div>
</body>
</html>
这是一张表格,您可以在其中工作或复制信息。https://docs.google.com/spreadsheets/d/1CJoPuq3sHE5L31GwlvS4Zygm1sL3M0HGC7MgW3rCq3g/edit#gid=0
解决方案
我相信你的目标如下。
- 您想从函数中检索 10 个值
checklogin()
。 - 电子表格的行是升序。
在这种情况下,如何进行以下修改?
从:
if (ranges.length > 0) {
obj.dateTime = ranges.flatMap(r => r.offset(0, 1, 1, 2).getDisplayValues());
return obj;
}
到:
if (ranges.length > 0) {
if (ranges.length > 10) {
ranges = ranges.splice(-10);
}
obj.date1Time = ranges.flatMap(r => r.offset(0, 1, 1, 2).getDisplayValues());
return obj;
}
- 通过这种修改,当 的长度
ranges
超过 10 时,检索最后 10 个值。 - 当 的长度
ranges
不超过 10 时,检索所有值。 - 如果要按降序排序并且要检索前 10 个值,请修改
ranges = ranges.splice(-10)
为ranges = ranges.splice(0, 10)
.
参考:
推荐阅读
- pintos - Pintos - 系统调用项目 2
- c# - 使用 TextReader 读取文件内容需要文件的完整路径 - 初学者
- java - 如何使用类型擦除来使用继承方法?
- jhipster - zuul可以配置监听80端口吗
- c# - xamarin表单如何绑定控件的子级
- ruby-on-rails - 如何在 Rails 控制器中处理和干燥验证
- angular - 在 Angular 6 中使用带有多个规范文件的 configureTestingModule
- typescript - 递归嵌套数组类型:可以吗?
- excel - 将 Excel 表数据转换为父子关系
- javascript - 基于布尔值排除对象的属性