猿问

如何将两个提交的值与谷歌表格单元格匹配并基于该值返回 html 模板

在下面的表格中:

https://docs.google.com/spreadsheets/d/15aBW7eoddWj_AiA032pMuUk7_GvI-xG6siVF5wJuh8g/edit#gid=2104954217

在 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);

        }

      }

但它总是给出错误的名字。该工作表是可编辑的,因此请随时使用它,并提前感谢您的帮助


MM们
浏览 121回答 1
1回答

宝慕林4294392

两件事情:row[3]不存在 - D 列中的值由工作表中的数组公式填充 - 而不是您发布的值。此外,如果要比较名称的小写版本,则需要使用 Sheet1 中的 C 列而不是 A 列如果您按照您的方式使用 for 循环 - 对于名称与行条目不对应的每个循环迭代,您将遇到名称错误情况,并且该else语句将直接调用“nameError.html”。我建议您改用indexOf(),它不仅可以检索工作表中存在的名称,还可以返回位置 - 所以不需要循环。样本:function doGet() {&nbsp; return HtmlService.createTemplateFromFile('Form.html').evaluate().setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);}function doPost (e) {&nbsp; var lock = LockService.getScriptLock();&nbsp; lock.tryLock(10 * 1000);&nbsp;&nbsp;&nbsp; try {&nbsp; &nbsp; var doc = SpreadsheetApp.getActiveSpreadsheet();&nbsp; &nbsp; var sheet = doc.getSheetByName("Sheet2");&nbsp; &nbsp; var headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0]&nbsp; &nbsp; var nextRow = sheet.getLastRow() + 1&nbsp; &nbsp; var newRow = headers.map(function(header) {&nbsp; &nbsp; &nbsp; return header === 'Timestamp' ? new Date() : e.parameter[header]&nbsp; &nbsp; })&nbsp; &nbsp; sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow])&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; var name = sheet.getRange(nextRow, 4).getValue();&nbsp; &nbsp; var code = newRow[2];&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; var sh = doc.getSheetByName("Sheet1");&nbsp; &nbsp; var names = sh.getRange(2, 3, sh.getLastRow()-1, 1).getValues();&nbsp; &nbsp; if (names.flat().indexOf(name) != -1) {&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; var existingCode = sh.getRange(names.flat().indexOf(name)+2, 2).getValue();&nbsp; &nbsp; &nbsp; if (existingCode == code){&nbsp; &nbsp; &nbsp; &nbsp; return HtmlService.createTemplateFromFile('Confirmation.html').evaluate()&nbsp; &nbsp; &nbsp; &nbsp; .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);&nbsp; &nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; return HtmlService.createTemplateFromFile('codeError.html').evaluate()&nbsp; &nbsp; &nbsp; &nbsp; .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; }&nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; else {&nbsp; &nbsp; &nbsp; return HtmlService.createTemplateFromFile('nameError.html').evaluate()&nbsp; &nbsp; &nbsp; .setXFrameOptionsMode(HtmlService.XFrameOptionsMode.ALLOWALL);&nbsp; &nbsp; }&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; catch (e) {&nbsp; &nbsp; return ContentService&nbsp; &nbsp; .createTextOutput(JSON.stringify({ 'result': 'error', 'error': e }))&nbsp; &nbsp; .setMimeType(ContentService.MimeType.JSON)&nbsp; }&nbsp;&nbsp;&nbsp; finally { lock.releaseLock() }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答