javascript - 如何将两个提交的值与谷歌表格单元格匹配并基于该值返回 html 模板
问题描述
在下面的表格中:
在 Sheet1 中:我在 C 列中有一些名称,在 B 列中有它们的代码
和 Sheet2 用户提交姓名和代码的地方
我需要将 Sheet2 中新提交的名称与 Sheet1 中的名称进行比较,每当我们匹配时,将新提交的代码与 Sheet1 中的相关代码进行比较;
如果新提交的名称与 Sheet1 中的任何名称匹配,则继续匹配其中的代码;
如果代码与 Sheet1 中名称旁边的代码匹配,则返回显示已确认的 HTML 模板
如果代码与 Sheet1 中名称旁边的代码不匹配,则返回显示错误代码的 HTML 模板
如果名称与 Sheet1 中的任何名称都不匹配,则返回显示错误名称的 HTML 模板
我试过下面的code.gs:
function doGet() {
return HtmlService.createTemplateFromFile("Form.html")
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function doPost(e) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName("Sheet2");
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];
var nextRow = sheet.getLastRow() + 1;
var newRow = headers.map(function(header) {
return header === "Timestamp" ? new Date() : e.parameter[header];
});
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]);
var name = newRow[3];
var code = newRow[2];
var sh = doc.getSheetByName("Sheet1");
var names = sh.getRange(2, 1, sh.getLastRow() - 1, 1).getValues();
for (var i = 0; i < names.length; i++) {
if (names[i] == name) {
var row = i;
var existingCode = sh.getRange(row, 2).getValue();
if (existingCode == code) {
return HtmlService.createTemplateFromFile("Confirmation.html")
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
} else {
return HtmlService.createTemplateFromFile("codeError.html")
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
} else {
return HtmlService.createTemplateFromFile("nameError.html")
.evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
}
} catch (e) {
return ContentService.createTextOutput(
JSON.stringify({ result: "error", error: e })
).setMimeType(ContentService.MimeType.JSON);
} finally {
lock.releaseLock();
}
}
但它总是给出错误的名字。该工作表是可编辑的,因此请随时使用它,并提前感谢您的帮助
解决方案
两件事情:
row[3]
不存在 - D 列中的值由工作表中的数组公式填充 - 而不是您发布的值。此外,如果要比较名称的小写版本,则需要使用 Sheet1 中的 C 列而不是 A 列如果您按照您的方式使用 for 循环 - 对于名称与行条目不对应的每个循环迭代,您将遇到名称错误情况,并且该
else
语句将直接调用“nameError.html”。
我建议您改用indexOf(),它不仅可以检索工作表中存在的名称,还可以返回位置 - 所以不需要循环。
样本:
function doGet() {
return HtmlService.createTemplateFromFile('Form.html').evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
function doPost (e) {
var lock = LockService.getScriptLock();
lock.tryLock(10 * 1000);
try {
var doc = SpreadsheetApp.getActiveSpreadsheet();
var sheet = doc.getSheetByName("Sheet2");
var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]
var nextRow = sheet.getLastRow() + 1
var newRow = headers.map(function(header) {
return header === 'Timestamp' ? new Date() : e.parameter[header]
})
sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])
var name = sheet.getRange(nextRow, 4).getValue();
var code = newRow[2];
var sh = doc.getSheetByName("Sheet1");
var names = sh.getRange(2, 3, sh.getLastRow()-1, 1).getValues();
if (names.flat().indexOf(name) != -1) {
var existingCode = sh.getRange(names.flat().indexOf(name)+2, 2).getValue();
if (existingCode == code){
return HtmlService.createTemplateFromFile('Confirmation.html').evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
} else {
return HtmlService.createTemplateFromFile('codeError.html').evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
}
else {
return HtmlService.createTemplateFromFile('nameError.html').evaluate()
.setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);
}
}
catch (e) {
return ContentService
.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))
.setMimeType(ContentService.MimeType.JSON)
}
finally { lock.releaseLock() }
}
推荐阅读
- javascript - js非阻塞函数
- google-analytics - 如何为电话设定目标
- semantic-ui-react - 中等大小的图标
- linux - 如何将 python-module 添加到 openwrt 自定义构建?
- ocaml - 使用 dune 运行 OUnit 测试
- php - 如何使用循环编写动态 sql 查询
- docker - 可以从主机 os 文件系统访问 Kubernetes 中挂载的卷吗
- networking - 从 docker-compose 容器到 LAN 主机的 Zeroconf 发现
- libreoffice - 在 UNO LibreOffice 中使用 writer_pdf_Export 过滤器时出现问题
- c# - C# 通过 ref 在引擎盖下传递它真的是通过引用传递吗?