[英]Add/Update Google Sheet Row Data Comparing Values from HTML Form Using Google Apps Script - Trying to Find Match on Sheet & Update Selected Row Data
我有一个 HTML 表单,它允许用户从 Google 表格中填充表格,并成功地将新行添加到表格中。 我根据本教程创建了 Apps 脚本。
我正在尝试扩展我的 Apps 脚本的 function 以根据两列中的数据搜索条目行以查找重复项,如果存在匹配项,则覆盖现有行。
我知道我需要一个 for 循环来遍历 Google 表格中的每一行以与有问题的表单数据字段进行比较,但我不知道如何访问每个字段。
这是形式的缩短示例(实际更长):
<form id="form"> <form id="form"> <input name="firstName" placeholder="firstName" /> <input name="lastName" placeholder="lastName" /> <input name="someOtherField" placeholder="someOtherField" /> <input name="someFourthField" placeholder="someOtherField" /> <div class="btn-success btn" onclick="SaveData()">Save Data</div> </form> </form> <script> function SaveData() { var formData = new FormData(document.getElementById("form")); fetch('https://script.google.com/macros/s/AKfycbwQFSXfeOKBHzf41MF6Nh5XIOjaPvr159-blUxsg5smD3BDH8qB4RUZRRo8q9nCJLb18w/exec', { method: 'post', body: formData, }) } </script>
我的 Apps 脚本在添加新行时运行良好,但是我的 for 循环没有正确编写,因此找不到匹配项,或者设置 nextRow 索引不起作用:
var sheetName = 'Entries' var scriptProp = PropertiesService.getScriptProperties() function intialSetup () { var activeSpreadsheet = SpreadsheetApp.getActiveSpreadsheet() scriptProp.setProperty('key', activeSpreadsheet.getId()) } function doPost (e) { var lock = LockService.getScriptLock() lock.tryLock(10000) try { var doc = SpreadsheetApp.openById(scriptProp.getProperty('key')) var sheet = doc.getSheetByName(sheetName) 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] }) var range = sheet.getDataRange(); var rangeData = range.getValues(); // Here is where the script is failing to find a match in the spreadsheet for(i = 1; i > rangeData.length; i++) { if(rangeData[i][0] == e.firstName && rangeData[i][1] == e.lastName) { nextRow = i; } } sheet.getRange(nextRow, 1, 1, newRow.length).setValues([newRow]) return ContentService.createTextOutput(JSON.stringify({ 'result': 'success', 'row': nextRow })).setMimeType(ContentService.MimeType.JSON) } catch (e) { return ContentService.createTextOutput(JSON.stringify({ 'result': 'error', 'error': e })).setMimeType(ContentService.MimeType.JSON) } finally { lock.releaseLock() } }
使用上面的脚本,每个表单条目都会创建一个新行,匹配永远不会正确。 所以我认为我的匹配查找逻辑或用于查找表单值和电子表格数据的语法有问题。 那么我错过了什么?
谢谢
编辑:为了帮助详细说明这个例子,我附上了一个示例电子表格的屏幕截图。 照原样,如果用户提交带有名字“Bob”和姓氏“Belcher”的表单,我希望剩余的表单数据用这些名称覆盖现有行。 但是,如果电子表格中的 firstName 和 lastName 字段不匹配,请添加一个新行。
即使存在现有行,上述脚本也总是添加新行。 我尝试使用这个问题的逻辑来实现我想要的结果,但这导致脚本完全失败(没有更新的行,也没有添加的行)。 我还尝试使用此视频中概述的逻辑步骤,它使用“indexOf”表单数据而不是带有 if 语句的 for 循环来查找匹配项。 该解决方案也不起作用
编辑编辑:我已经提供了整个脚本,并录制了当前脚本行为与所需行为的短视频。 希望这能澄清我的问题。 谢谢
我相信你的目标如下。
firstName
和lastName
的值。 而且,当电子表格中存在这些值时,您希望更新该行。 当电子表格中不存在这些值时,您希望将 append 数据作为新行。当您的脚本被修改以实现此目的时,以下修改如何?
for(i = 1; i > rangeData.length; i++) { if(rangeData[i][0] == e.firstName && rangeData[i][1] == e.lastName) { nextRow = i; } }
for (var i = 0; i < rangeData.length; i++) { if (rangeData[i][0] == e.parameter.firstName && rangeData[i][1] == e.parameter.lastName) { nextRow = i + 1; break; } }
for(i = 1; i > rangeData.length; i++)
,没有循环完成。 而且, e.firstName
和e.lastName
总是undefined
。 而且,在您的脚本中,需要在找到值时完成循环。当您修改 Google Apps 脚本时,请将部署修改为新版本。 这样,修改后的脚本就会反映在 Web 应用程序中。 请注意这一点。
You can see the detail of this in the report of " Redeploying Web Apps without Changing URL of Web Apps for new IDE ".
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.