我有一個 HTML 表單,允許用戶從 Google 表格中填充表格,并成功地將新行添加到表格中。我根據本教程創建了 Apps 腳本。
我正在嘗試擴展我的 Apps 腳本的功能,以根據兩列中的資料在條目行中搜索重復項,如果存在匹配項,則覆寫現有行。
我知道我需要一個 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 回圈來查找匹配項。該解決方案也不起作用
電子表格截圖
編輯編輯: 我已經提供了整個腳本,并錄制了當前腳本行為與所需行為的短視頻。希望這能澄清我的問題。謝謝!
uj5u.com熱心網友回復:
我相信你的目標如下。
- 提交 HTML 表單時,您希望檢查電子表格的值
firstName和lastName來自電子表格的值。而且,當電子表格中存在這些值時,您希望更新該行。當電子表格中不存在這些值時,您希望將資料附加為新行。
當您的腳本被修改以實作此目的時,以下修改如何?
從:
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 Apps 中。請注意這一點。
您可以在“在不更改新 IDE 的 Web 應用程式 URL 的情況下重新部署 Web 應用程式”的報告中查看詳細資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/498425.html
標籤:javascript 形式 for循环 谷歌应用脚本 谷歌表格
上一篇:為什么不安全讀取sbyte->byte在Release模式下不一致:*(byte*)(&sbyteValue)?
下一篇:使按鈕與另一個按鈕動態保持距離
